以下内容只讨论win中的动态链接和静态链接。
首先,一个程序从编译的运行的全过程:
预编译->编译->汇编->链接
其中,到了汇编这一步生成.obj文件,也就是说,对于一个单独的.c文件,只要可以找到他的头文件,到了这一步都不会报错!
然后,这些汇编生成的obj文件,我们可以选择生成lib或lib+dll。 其中lib包含了所有需要的东西,包括代码,而lib+dll中,lib只包含dll中函数的入口,位置等等信息,真正的代码在dll里面。
使用静态链接:
在win上利用visual studio 构建时,如果我们用到了静态链接库,需要两个东西
1. .h文件:指定include directories, 包含了lib文件中函数的声明等等,
2. 指明lib文件的位置,即linker->General中的Additional Linker Directories, 指明包括lib文件的路径。然后再Input选项中,指明Additional Dependencies, 具体指明lib的名字。
结果:.h文件里面的内容被替换到载入了这个头文件的那些源文件里面,然后.lib文件在其他的源码生成了obj文件以后被链接进入可执行文件。此时.lib文件在可执行程序中已经不需要了,删掉也没有关系,因为已经被链接进去了,所以这时候的可执行文件会比较大。
使用动态链接
在win上利用visual studio构建程序,如果使用到了动态链接库, 我们需要做
1. 头文件。
2. 明lib文件的位置,即linker->General中的Additional Linker Directories, 指明包括lib文件的路径。然后再Input选项中,指明Additional Dependencies, 具体指明lib的名字。
3. 使得程序在运行时可以找到dll的位置,所以其实有两种方法,A:添加dll文件的路径到系统环境变量Path里面 B:将dll文件移动到系统默认的dll文件夹下。
其实这时候生成的可执行文件会小很多,因为dll文件并不在可执行文件中,而是在程序运行时动态载入的。但是这时候dll文件就不可以删除了,否则程序会找不到dll文件。真正被连接到可执行程序里面的仍然是头文件里面的内容和lib文件,但是这时候的lib文件不包括真正的函数代码了,只包括dll文件函数的入口!所以可执行文件会小。上面说的方法是隐式调用