zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用runOnUiThread更新UI
    Leetcode Symmetric Tree
    EBS 开发中如何动态启用和禁止请求(Current Request)的参数
    c 陷阱与缺陷(一)
    钟浩荣战胜病魔,不负众望重踏传智播客!
    【原创】分布式之elk日志架构的演进
    【强烈谴责】博客园园友随意抄袭他人文章并作为自己原创的行为
    【原创】研发应该懂的binlog知识(下)
    【原创】研发应该懂的binlog知识(上)
    【原创】一个线程oom,进程里其他线程还能运行吗?
  • 原文地址:https://www.cnblogs.com/superbi/p/5505793.html
Copyright © 2011-2022 走看看