VS2017 DLL动态库使用教程【七】为什么我的程序不能在别人电脑运行

考虑一个很最最最简单的程序:

#include <stdio.h>
#include <Windows.h>
int main()
{
	printf("你好\n");
	system("pause");
	return 0;
}

将其编译,得到一个*.exe文件。


在本地自然可以顺便运行,有时候你刚刚做完一个这样的练习,迫不及待地要向朋友炫耀一下。一脸淫笑的你守在QQ旁正期待着赞扬的词汇,一边又脑补一下朋友的崇拜,可时间似乎凝固了,仿佛过了一个世纪后——“你发的这东西我怎么打不开啊?”


这是一个严重的问题!

你开始是质疑,是困惑,你觉得他脑子有问题连exe程序都打不开,又或觉得是win太复杂了,他不太适合给这些巨婴用,也许我应该做一个从新开发一个操作系统,然后吊打微软收购谷歌....正当你思考这些的时候,一张截图突然丢过来:


你震惊了,你搞不懂他为什么会发生这种情况,他已经超出了的知识范畴,至少你翻遍课本也找不出个解决方案。

你顿时倍感失落,发现竟然自己竟如此无力,刚刚还在思考等到驻进硅谷后给我五姑姑二弟的小侄子安排个什么工作好,顿时梦想破灭了,就如被戳破的肥皂泡,一切都成了过眼烟云....

好了,做梦结束,我没有什么朋友,上边的错报是我用win7虚拟机运行的结果。


为什么会这样呢?

原因是vs默认为动态编译。

在之前的教程里我们学了静态编译与动态编译的区别,我再把他搬过来:

静态编译在程序编译时dll会被连接到目标代码中,程序运行时将不再需要该静态库

动态编译在程序编译时dll并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。


因为我的虚拟机没有安装vs,电脑找不到程序使用的这个库(这个库是vs自带的),所以就没办法运行。

我们只需设置为静态编译即可,让dll写进exe内,没有外部库也可以运行。

然后重新编译即可。

对于vs来说:

静态编译/MT,/MTD 是指使用libc和msvc相关的静态库(lib)。

动态编译,/MD,/MDd是指用相应的DLL版本编译。

其中字母含义  d:debug    m:multi-threading(多线程)    t:text代码    d:dynamic(动态)


值得注意的是,使用静态编译回让程序变大



猜你喜欢

转载自blog.csdn.net/nullccc/article/details/81015012