因为很长一段时间内并不知道这个编译参数究竟是干什么用的,只知道这个参数在 NOI 系列赛事中普遍使用,并且会导致编译输出文件变大,直到碰到具体问题了才发现这个参数的作用
-static 参数是静态链接开关,不加这个参数默认是动态链接,加上这个参数以后是静态链接,先说一下静态链接和动态链接都是什么吧
静态链接与动态链接
说白了,静态链接是比较保守的编译方法,会把包含的所有头文件都编译到输出文件里
这样做有很多缺点,首先,对于单个文件,它编译的时候会将包含的所有头文件都编译一遍,输出文件大小和编译时长都会增加,其次,对于相同的头文件,它在不同的文件中都会被分别编译一次,造成了很大的内存浪费
因此,有了一种优化方法,就是把每个头文件单独编译一次,成为独立的输出文件,在编译单个文件时,不需要再把头文件编译一遍,而是在需要调用头文件内内容的时候直接去调用对应的头文件输出文件,这样就减少了内存的浪费,这就是动态链接
这里所述头文件的输出文件称为动态链接库,Windows 下动态链接库的文件后缀为 .dll(mingw 里自带 dll)
原理什么的不想讲,应该也用不到,想了解的推荐这一篇: 网页链接
为什么我们需要静态链接
经过上述比较,动态链接在内存优化方面完爆静态链接
但是静态链接并非一无是处,在这里我不想分析运行时长等等效果不大的东西,因此我们从一个前几天我遇到的实际问题入手
前几天我写了一份 C++ 程序,并且把它编译成 exe,准备把 exe 发给朋友
过了一会,我被告知 exe 无法运行,并且收到了这样一张截图:
正是从这张截图入手,我探究了一下为什么会出现这种情况
在得知图中缺失的 dll 是动态链接库之后,我顿时明白了是什么导致的这种问题:我使用了动态链接来编译这个文件,但是我只把 exe 文件发过去了,而没有将对应的 dll 文件发过去,动态链接找不到库文件,自然运行不了
也就是说,如果想要在另一台电脑上运行一个动态链接的 exe 文件,要么另一台电脑上已经有该 dll 文件了,要么就要把 dll 文件也一并发过去,在这一点上动态链接就不如静态链接方便了,这就是平常我们说的跨平台兼容性
这种问题尤其出现在游戏领域,经常有游戏提示缺失 dll 无法运行,现在看来只有下一个对应的 dll 才是正解