一、生成动态库: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