使用静态库编译PIC对象

时间:2012-12-21 11:57:34

标签: c linux gcc shared-libraries

我在linux上生成一个共享库,我正在使用这个xml解析器“mini xml”来解析我的库的一些xml配置文件。我想要的是不要对这个xml解析器有任何依赖,所以我想使用供应商提供的静态libmxml.a库,而不是使用libmxml.so,这也是libmxml.so,这样我的共享库就可以了部署时不依赖于libmxml。我试过跟随,但它不起作用。

  

gcc -fPIC -o myobject.o -static -lmxml -c myobject.c

但它会发出警告

  

链接器输入未使用,因为链接未完成

我缺少什么?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

您收到警告,因为-c表示仅编译。 链接器永远不会运行,因此作为链接器命令的-lmxml无效。

-static 会使整个可执行文件变为静态,这也意味着一个静态的libc。 这可能不是你想要的。 要仅在libmxml.a中链接静态使用:

gcc -fPIC myobject.o -o executable /usr/lib/libmxml.a

gcc -fPIC myobject.o -o executable -Wl,-Bstatic -lmxml -Wl,-Bdynamic

创建共享库而不是可执行文件添加 -shared

答案 1 :(得分:1)

您需要专门为此构建mxml库,创建一个带有PIC代码(-fPIC)的静态库,比如说libmxml_pic.alibmxml.a包含位置相关的代码,它只适用于可执行文件(在32位x86上它可以工作,但它仍然很难看。)

您还希望避免从库中导出mxml符号。您可以使用版本脚本(--version-script到ld,请参阅文档)和/或在编译mxml对象时传递-fvisibility=hidden来执行此操作。