小编典典

混合静态库和共享库

linux

我有一个项目,其中有一个静态库libhelper.a,另一个有我的实际共享库libtestlib.so。我的目标是链接libhelper.alibtestlib.so。在Linux
/ BSD上可以吗?尝试创建测试程序时,出现以下错误:

./prog1:/usr/local/lib/libtestlib.so.1.0:未定义的符号’‘

我的猜测是,这是因为libhelper.a不是用-fPICwhile
编译的libtestlib.so。使用共享库(也依赖于静态库)来构建程序的正确方法是什么?

谢谢!


阅读 343

收藏
2020-06-03

共1个答案

小编典典

我的目标是将libhelper.a链接到libtestlib.so。在Linux上有可能吗?

当然。应该这样做:

gcc -shared -fPIC -o libtestlib.so $(OBJS) \
  -Wl,--whole-archive -lhelper -Wl,--no-whole-archive

libhelper.a未使用-fPIC编译

最好使用重建libhelper.a
-fPIC。如果那不可能,上面的命令仍然可以使用Linux/ix86,但是不能在eg上使用Linux/x86_64

使用共享库(也依赖于静态库)来构建程序的正确方法是什么?

如果包括libhelper.alibtestlib.so如上,那么简单:

gcc main.c -ltestlib

是你所需要的全部。如果您坚持与链接libhelper.a,那么您必须告诉最终用户他必须与链接,例如

gcc main.c -ltestlib -lhelper

无法指定libtestlib.so取决于libhelper.a

2020-06-03