混合静态库和共享库

时间:2011-03-25 22:44:59

标签: linux shared-libraries static-libraries dynamic-linking fpic

我有一个项目,我有一个静态库libhelper.a,另一个项目是我的实际共享对象库libtestlib.so。我的目标是将libhelper.alibtestlib.so相关联。这可能在Linux / BSD上吗?当我尝试创建测试程序时,出现以下错误:

  

./ prog1:/usr/local/lib/libtestlib.so.1.0:undefined symbol''

我的猜测是发生这种情况是因为当-fPIClibtestlib.so时,libhelper.a未使用{{1}}进行编译。构建使用共享库的程序的正确方法是什么?这些库也具有静态库的依赖性?

谢谢!

1 个答案:

答案 0 :(得分:11)

  

我的目标是将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