Linux 混合静态库和共享库

Linux 混合静态库和共享库,linux,shared-libraries,static-libraries,dynamic-linking,fpic,Linux,Shared Libraries,Static Libraries,Dynamic Linking,Fpic,我有一个项目,其中一个是静态库libhelper.a,另一个是实际的共享对象库libtestlib.so。我的目标是将libhelper.a链接到libtestlib.so。这在Linux/BSD上可能吗?当我尝试并创建一个测试程序时,我得到了以下错误: ./prog1:/usr/local/lib/libtestlib.so.1.0:未定义的符号“” 我猜这是因为libhelper.a不是用-fPIC编译的,而libtestlib.so是。构建使用共享库(也依赖于静态库)的程序的正确方法是什么

我有一个项目,其中一个是静态库
libhelper.a
,另一个是实际的共享对象库
libtestlib.so
。我的目标是将
libhelper.a
链接到
libtestlib.so
。这在Linux/BSD上可能吗?当我尝试并创建一个测试程序时,我得到了以下错误:

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

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

谢谢


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

当然。这应该做到:

gcc -shared -fPIC -o libtestlib.so $(OBJS) \
  -Wl,--whole-archive -lhelper -Wl,--no-whole-archive
libhelper.a未使用-fPIC编译

最好使用
-fPIC
重建libhelper.a。如果不可能,上述命令仍将在
Linux/ix86
上工作,但在例如
Linux/x86_64
上不工作

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

如果如上所述将
libhelper.a
包含到
libtestlib.so
中,那么简单:

gcc main.c -ltestlib
这就是你所需要的。如果您坚持链接到
libhelper.a
,那么您必须告诉最终用户他必须链接到例如

gcc main.c -ltestlib -lhelper

无法指定
libtestlib.so
依赖于
libhelper.a

“将libhelper.a链接到libtestlib.so”什么?到目前为止您尝试了什么?在任何情况下,我都不知道如何将非PIC代码链接到共享库中。静态库通常只链接到可执行文件中,这就是为什么很少使用PIC编译它们的原因。你不能将这两个库链接到可执行文件中,或者从一开始就用PIC构建它们吗?谢谢,我可以用-fPIC重建libhelper.a,所以我将继续这样做。