5

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

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

我的猜测是这是因为libhelper.a未编译为-fPIClibtestlib.so是。构建使用共享库的程序的正确方法是什么?这些库也具有静态库的依赖关系?

谢谢!

+0

“将libhelper.a链接到libtestlib.so”什么? – 2011-03-26 17:14:02

+0

到目前为止您尝试了什么?无论如何,我不知道有什么方法将非PIC代码链接到共享库中。静态库通常只能链接到可执行文件中,这就是为什么它们很少用PIC编译的原因。你不能将两个库链接到可执行文件,或者从一开始就用PIC来构建? – Philipp 2011-03-26 18:24:53

回答

11

我的目标是将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上运行,但不会在例如Linux/x86_64

构建使用共享库的程序的正确方法是什么?这些共享库也具有静态库的依赖关系?

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

gcc main.c -ltestlib 

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

gcc main.c -ltestlib -lhelper 

没有办法指定libtestlib.so取决于libhelper.a

+0

谢谢,我可以用-fPIC重建libhelper.a,所以我会继续这样做。 – 2011-03-28 16:35:09