混合静态库和共享库
我有一个项目,我有一个静态库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
编译这是最好的重建libhelper.a与-fPIC
。如果这是不可能的,上述命令仍然可以在Linux/ix86
上运行,但不会在例如Linux/x86_64
。
构建使用共享库的程序的正确方法是什么?这些共享库也具有静态库的依赖关系?
如果包括libhelper.a
到libtestlib.so
如上,那么简单:
gcc main.c -ltestlib
是你所需要的。如果您坚持与libhelper.a
联系,那么您必须告诉最终用户他必须与例如
gcc main.c -ltestlib -lhelper
没有办法指定libtestlib.so
取决于libhelper.a
。
谢谢,我可以用-fPIC重建libhelper.a,所以我会继续这样做。 – 2011-03-28 16:35:09
“将libhelper.a链接到libtestlib.so”什么? – 2011-03-26 17:14:02
到目前为止您尝试了什么?无论如何,我不知道有什么方法将非PIC代码链接到共享库中。静态库通常只能链接到可执行文件中,这就是为什么它们很少用PIC编译的原因。你不能将两个库链接到可执行文件,或者从一开始就用PIC来构建? – Philipp 2011-03-26 18:24:53