这些东西算是编写C++大型软件在处理互相之间的依赖关系,或者编译开源库的时候会经常用到的知识,有时候经常会遇到一些让人崩溃的链接错误,比如 error LNK 201 205 等等,往往是配置不对引起的。在《Game Engine Architecture》中也专门花了一个章节讲这些事情,因此写下来仅供以后参考。
我们都知道C++ 编译过之后会生成目标文件 也就是.obj 或者.o格式的文件。目标文件就是编译器翻译过的机器代码,但是目标文件并不能被机器执行,因为其内部的内存地址并没有被确定,同时所有的外部符号没有被解释(也就是没有连接) 而静态库lib就是obj文件的打包,linker用lib生成可以执行的exe文件的过程就是静态链接,这过程中要干的也就是两件事,确定内存的最终相对地址,解释所有的外部符号。
而DLL是介于lib和exe之间的一种文件,可以像lib一样当成库使用,也可以单独被操作系统调用 和exe一样。通过DLL动态连接生成的exe包含部分已经完全解释的代码,但是所有的外部函数都是需要DLL本身才能解释的,这就是为啥经常看到一个程序缺少xxxDLL无法运行的原因。
在VS或者CMake里可以指定工程的生成方式,大部分第三方的开源库是编译成lib的,这样可以方便自己开发的程序运行,不需要拷贝很多DLL。
/MT和/MD 是关于多线程代码生成的一个选项,如果第三方库lib的生成和引用了这些库的工程生成方式不一致的话就会造成linker错误,因为/MT (多线程)和/MD(多线程DLL) 使用的分别是MSVCRT.lib 和 LIBCMT.lib 同时使用就会造成linker对两个lib中的同名函数分不清楚。