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 注: -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 -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 注: -shared是g++的选项,与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/