Linux下动态库的使用

一、生成动态库:html

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

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

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

能够经过ldconfig -n 来查看动态库的连接.net

二、使用动态库htm

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

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

四、三种标准库连接方式的编译器选项及优缺点以下:编译器

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

-static-libgcc -static-libstdc++ io

-L. -pthread -lrt -ldl

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

五、 半静态连接方式,主要在于其还须要在连接前增长额外的一个步骤:
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>

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

-static:静态连接全部库 

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

 

参考文献:

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

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

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

相关文章
相关标签/搜索