C++程序,编译,链接
.h文件,.lib文件与.dll文件
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要。
H文件作用是:声明函数接口DLL文件作用是: 函数可执行代码。
当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用: 告诉链接器 调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项 .LIB文件,它起到桥梁的作用。如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中
静态链接库(Lib)与动态链接库(DLL)的区别
静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
lib库有两种,一种是包含了函数所在DLL文件和文件中函数位置的信息,称为导出库;一种是包含函数代码本身,一般现有的DLL,用的是前一种库
静态链接库是在exe链接的时候将lib文件过去的
Linux和Windows平台下各种文件的对应关系是.o和.obj, .a和.lib,.so和.dll
Linux编译链接的过程
生成.o文件
g++ -c add.cpp
编译出Linux动态链接库
g++ -shared add.o -o add.so
编译静态链接库
ar -rcs libadd.a add.o
编译main的o文件
g++ -c main.cpp
main链接静态链接库
g++ -o main main.o libadd.a
或
g++ -o main main.o -L ./ -ladd
-L后面的参数是要链接的库的目录
附原文链接:https://www.cnblogs.com/azbane/p/7364060.html