• linux下动态调用静态库的方法


    LINUX下动态库调用静态库的方法

    有这样一种情形,在创建一个动态库的同时,可能会调用一个静态库,这个静态库可能是你自己写的,也可能是第三方的。比如有下面五个文件,生成一个静态库,一个动态库,一个执行文件:

    /////// 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;

       }

     

    怎么办呢?方法有两种:

    1、  动态库是动态库,静态库是静态库,各自编译自己的,然后在最终使用的可执行文件上再动态编译加载。按上面的例子来说明:

    静态库的.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 : -sharedg++的选项,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  -L. -lshared -lstatic -o test.exe // link libshared.so test.exe

    2、  把静态库直接打到动态库中去。

    静态库的.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 –L. -lstatic -o libshared.so   // 生成动态库libshared.so : -sharedg++的选项,shared.o无关. -lstatic选项把libstatic.a的函数加入动态库中.

         g++ test.cpp   –L. -lshared -o test.exe // link libshared.so test.exe.

    这个例子是从网上找来的,非常感谢。

    至于哪种方式好,个人还是觉得看你的实际应用情况,仁者见仁,智者见智。

    将多个静态库文件合成一个静态库文件。

    假设tempa.a, tempb.a tempc.a /home/lib目录下

    mkdir /mytemp/libTest

    cd /mytmp/libTest

    ar x /home/lib /tempa.a

    ar x /home/lib /tempb.a

    ar x /home/lib tempc.a

    ar cru libTest.a *.o

    ranlib libTest.a


    来源: http://fpcfjf.blog.163.com/blog/static/554697932013112532144781/

  • 相关阅读:
    spring中Bean的懒加载
    ActiveMQ学习教程
    Maven中解决jar包冲突的三种方式
    Spring的日志管理
    mybatis使用collection查询集合属性规则
    springcloud之Feign伪装
    springcloud之Hystrix熔断入门
    springcloud的负载均衡Ribbon入门
    springcloud的Eureka启动时报错:Connection refused: connect
    springboot启动过程中出现You must configure either the server or JDBC driver (via the serverTimezone configuration
  • 原文地址:https://www.cnblogs.com/cfzhang/p/d6d38fd16ace4d3c04140e8d74a75908.html
Copyright © 2020-2023  润新知