zoukankan      html  css  js  c++  java
  • 动态库调用静态库

    转:http://hi.baidu.com/proinsight/item/150dd3e6e506d1a9c10d7552

    生成动态库: 需要的目标文件得用-fPIC选项生成.

    而静态库所需的目标文件可以不用-fPIC选项.

    一个应用程序调用动态库, 而这个动态库其中的函数调用某静态库时,如何生成应用程序呢?

    例:

    /////// static.h

    void static_print();

    ///////static.cpp

    #include <iostream>

    #include "static.h"

    void static_print() {

         std::cout<<"This is static_print function"<<std::endl;

    }

    ////// shared.h

    void shared_print();

    ////// shared.cpp

    #include <iostream>

    #include "shared.h"

    #include "static.h"

    void shared_print() {

           std::cout<<"This is shared_print function";

            static_print();

    }

    ////////test.cpp

       #include "share.h"
      
    int main()
    {
           shared_print();
           return 0;
       }

    方法一:

          静态库的.o文件也用-fPIC生成. 生成动态库时把静态库加入.

         生成应用程序时只加载动态库

         g++ -c -fPIC static.cpp // 生成static.o

         ar -r libstatic.a static.o // 生成静态库libstatic.a

         g++ -c -fPIC shared.cpp // 生成shared.o

         g++ -shared shared.o -lstatic -o libshared.so   // 生成动态库libshared.so 注: -shared是g++的选项,与shared.o无关. -lstatic选项把libstatic.a的函数加入动态库中.

         g++ test.cpp -lshared -o test.exe // link libshared.so 到test.exe中.

    方法二:

         静态库的.o文件不用-fPIC生成. 生成动态库时不加表态库.

        生成应用程序时加载动态库和静态库.

         g++ -c static.cpp // 生成static.o

         ar -r libstatic.a static.o // 生成静态库libstatic.a

         g++ -c -fPIC shared.cpp // 生成shared.o

         g++ -shared shared.o -o libshared.so // 生成动态库libshared.so 注: -shared是g++的选项,与shared.o无关. 这时如果加-lstatic. error:relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

         g++ test.cpp -lshared -lstatic -o test.exe // link libshared.so 到test.exe中.

    两种方法的不同之处在于static_print的实际代码一个在.so中.一个在最后test.exe文件中. 个人觉得第一种方法更好, 因为动态库应该看成一个可以独立运行的程序.

  • 相关阅读:
    LR与SVM的异同
    精确率,召回率
    XgBoost推导与总结
    梯度下降中的步长选择-线性搜索
    页面去掉某个css属性
    composer 安装某个插件后 引入方法
    javascript,检测对象中是否存在某个属性
    js 计算字符串长度 中文为2 英文为1
    laravel 新手 =_= 持续更新
    php compact() 函数
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3471888.html
Copyright © 2011-2022 走看看