转自https://blog.csdn.net/freestyle4568world/article/details/49817799
库文件分为静态链接库和动态链接库。
1.静态链接库
在链接阶段,将目标文件和库文件合并,生成可执行文件。因此可执行文件会比较大。
举例:
头文件add.h:
#ifndef _ADD_H
#define _ADD_Hg++ -o test test.cpp -L./addlib -lad
#include <iostream>
int add(int a, int b);
#endif
对应的源文件add.cpp:
#include "add.h"
#include <iostream>
int add(int a, int b){
return a+b;
}
生成静态库:
g++ -c add.cpp生成.o文件
ar -crv libadd.a add.o生成libadd.a库文件
调用该库的主函数:
#include "./addlib/add.h"
using namespace std;
int main(){
cout<<add(3,4)<<endl;
}
编译一下:
g++ -o test test.cpp -L./addlib -ladd
-L为库文件目录,-l为libadd.a库文件掐头去尾
2.动态链接库
静态库在链接时将库文件合成到可执行文件中,因此可执行文件会很大,优点是可以移植性强。动态库在链接时不会将库文件合成到可执行文件中,而是在执行时动态调用库文件,所以生成的可执行文件很小,但是可移植性差。所以动态链接更常见。不过两者应该合理选择。
生成动态库:
g++ -fPIC -shared -o libadd.so add.cpp
编译:
g++ -o test test.cpp -L./addlib -ladd
执行:
./test
发现找不到libadd.so,因为linux默认在/etc/ld.so.conf文件中设置了动态链接库寻找路径。在里面加上一行libadd.so的绝对地址即可。再执行ldconfig,然后运行./test,成功。
综上所述,动态和静态链接库的选择要视情况而定,一般推荐动态链接库。