我在linux上生成一个共享库,我正在使用这个xml解析器“mini xml”来解析我的库的一些xml配置文件。我想要的是不要对这个xml解析器有任何依赖,所以我想使用供应商提供的静态libmxml.a库,而不是使用libmxml.so,这也是libmxml.so,这样我的共享库就可以了部署时不依赖于libmxml。我试过跟随,但它不起作用。
gcc -fPIC -o myobject.o -static -lmxml -c myobject.c
但它会发出警告
链接器输入未使用,因为链接未完成
我缺少什么?任何帮助将不胜感激。
答案 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.a
。 libmxml.a
包含位置相关的代码,它只适用于可执行文件(在32位x86上它可以工作,但它仍然很难看。)
您还希望避免从库中导出mxml符号。您可以使用版本脚本(--version-script
到ld,请参阅文档)和/或在编译mxml对象时传递-fvisibility=hidden
来执行此操作。