linux 调用静态库函数,动态库调用静态库示例讲解

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

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

例:

/// static.h

void static_print();

///static.cpp

#include

#include "static.h"

void static_print() {

std::cout<

}

// shared.h

void shared_print();

// shared.cpp

#include

#include "shared.h"

#include "static.h"

void shared_print() {

std::cout<

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文件中. 个人觉得第一种方法更好, 因为动态库应该看成一个可以独立运行的程序.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值