本文参考https://www.cnblogs.com/azbane/p/7364060.html
.h .lib .dll三者的关系是:
H文件作用是:声明函数接口
DLL文件作用是: 函数可执行代码
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
例如配置opencv时候:要在属性表里添加包含目录(头文件),库目录(dll),连接器里的附加依赖项(lib)
当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?
(动态链接库 lib+dll)这就是LIB文件的作用: 告诉链接器 调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项 .LIB文件,它起到桥梁的作用。
(静态连接库 只有lib)如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中
静态链接库(Lib)与动态链接库(DLL)的区别
静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;
动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了,所以很大。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库
“那他和直接给出那个函数定义的文件,比如.cpp文件,和头文件有什么区别,静态链接库有什么用”
答:cpp文件是源代码,库文件是编译后的二进制代码,比如你可以调用Windows的API,但是不能看到其源代码一样。
“静态链接库中的lib文件只要用到,则整个lib文件的内容都放进了exe文件中,那它是被编译进去还是链接的时候连接进去的呢?”
答:是在链接的时候将lib链接到目标代码中。
程序处理步骤:预处理 编译 汇编 连接 执行
所以一般库文件都是编译好的,直接拿来连接就行
使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。要打包发行的话一般用静态链接库
库也是分32位和64位的,而且也分debug和release,静态链接库的生成与使用需要用相同版本。如使用opencv库,debug下要用debug编译的opencv,release下要用release中的opencv。具体做法是:链接器/输入/附加依赖项 这个opencv_world320d.lib(320是3.2.0版本,d表示debug)要在release中运行,在前面加上opencv_world320.lib
为什么呢?Debug和Release的本质区别其实就是两者编译的方式不同。