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

  • 相关阅读:
    操作excel语法
    MySQL exists的用法介
    vim 快捷键
    mysql中datetime比较大小问题
    MySQL CAST与CONVERT 函数的用法
    tbxvUZIAJH
    springBoot相关
    springCloud
    Spring Boot使用JavaMailSender发送邮件
    RabbitMq 消息队列
  • 原文地址:https://www.cnblogs.com/superbi/p/5505793.html
Copyright © 2011-2022 走看看