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

本文介绍在LINUX环境下动态库如何调用静态库的两种方法:一是分别编译动静态库并在最终可执行文件中加载;二是将静态库内容合并到动态库中。并提供了具体的g++编译命令实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/

转载于:https://www.cnblogs.com/cfzhang/p/d6d38fd16ace4d3c04140e8d74a75908.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值