Linux下动态库的使用

1、生成动态库:

gcc -fPIC -shared -o libdemo.so demo.c

考虑程式库major的升级会破坏兼容性;而minior的升级则可能不会,一般建议用以下方式来生成动态库。

gcc -fPIC -shared -Wl,-soname,libdemo.so.major -o libdemo.so.major.minor demo.c

可以通过ldconfig -n 来查看动态库的链接

2、使用动态库

头文件引入时必须,然后再加入编译选项-ldemo即可(demo为动态库的名)。

3、Linux的标准库存在3种链接方式:全静态 , 半静态,全动态,根据参考文献1的结论,大部分情况建议采用半静态方式。

4、三种标准库链接方式的编译器选项及优缺点如下:

标准库链接方式示例编译器选项优点缺点
全静态 -static -pthread -lrt -ldl 不会发生应用程序在 不同 Linux 版本下的标准库不兼容问题。 生成的文件比较大,
应用程序功能受限(不能调用动态库等)
全动态 -pthread -lrt -ldl 生成文件是三者中最小的 比较容易发生应用程序在 
不同 Linux 版本下标准库依赖不兼容问题。
半静态 (libgcc,libstdc++)

-static-libgcc -static-libstdc++ 

-L. -pthread -lrt -ldl

灵活度大,能够针对不同的标准库采取不同的链接策略,
从而避免不兼容问题发生。
结合了全静态与全动态两种链接方式的优点。
比较难识别哪些库容易发生不兼容问题,
目前只有依靠经验积累。
某些功能会因选择的标准库版本而丧失。

5、 半静态链接方式,主要在于其还需要在链接前增加额外的一个步骤:
ln -s `g++ -print-file-name=libstdc++.a`,作用是将 libstdc++.a(libstdc++ 的静态库)符号链接到本地工程链接目录。
-print-file-name 在 gcc 中的解释如下:
-print-file-name=<lib> Display the full path to library <lib>

6、gcc的编译器选项说明:

-static:静态链接所有库 

-static-libgcc:静态链接 gcc 库 
-static-libstdc++:静态链接 c++ 库 

 

参考文献:

1、http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/index.html

2、http://www.cnblogs.com/skynet/p/3372855.html

3、http://blog.csdn.net/zjg555543/article/details/7514946

posted on 2016-05-20 11:17  修身  阅读(488)  评论(0编辑  收藏  举报

导航