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!