Linux 动态库编译指南
Linux 下动态库文件的文件名形如 libxxx.so,其中 so 是 Shared Object 的缩写,即可以共享的目标文件。
在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用。
程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而能节省内存空间。
Linux 下生成和使用动态库的步骤如下:
- 编写源文件。
 - 将一个或几个源文件编译链接,生成共享库。
 - 通过 
-L<path> -lxxx的 gcc 选项链接生成的 libxxx.so。 - 把 libxxx.so 放入链接库的标准路径,或指定 
LD_LIBRARY_PATH,才能运行链接了 libxxx.so 的程序。 
源文件
样例
1  | //max.c  | 
共享库
编译生成共享库:
1  | $ gcc -fPIC -shared -o libmax.so max.c  | 
 -fPIC 是编译选项,PIC 是 Position Independent Code 的缩写,表示要生成位置无关的代码,这是动态库需要的特性; 
-shared 是链接选项,告诉 gcc 生成动态库而不是可执行文件。
编写头文件
为了让用户知道我们的动态库中有哪些接口可用,我们需要编写对应的头文件。
1  | //max.h  | 
测试
编写一个测试程序 test.c 引用编译好的 libmax.so
1  | //test.c  | 
编译命令1
$ gcc test.c -L. -lmax -o test
-lmax 表示要链接 libmax.so
-L. 表示搜索要链接的库文件时包含当前路径
运行
1  | $ ./test  | 
自动化编译
利用 make 来进行自动化编译
1  | 
  | 
用法1
2
3$ make build # 编译动态库 libmax.so
$ make test # 生成 test 可执行程序 
$ make clean # 清理编译和测试结果 
附录
例程见我的 Github
相关博文 Linux 静态库编译指南。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Serendipity!





