【问题标题】:Compiling PIC object with static library用静态库编译 PIC 对象
【发布时间】:2012-12-21 11:57:34
【问题描述】:

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

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

但它会发出警告

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

我错过了什么?任何帮助将不胜感激。

【问题讨论】:

    标签: c linux gcc shared-libraries


    【解决方案1】:

    您会收到警告,因为 -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

    【讨论】:

    • 但它不会使 myobject.o 成为可执行文件吗?我先编译目标文件,然后将它们合并到一个共享库中。
    • @JewelThief:是的,链接外部库是在最后一个“组合”步骤中完成的,这称为链接。是的,图书馆也是链接的。
    • @JewelThief:还要注意 jilles 的回答:这个静态构建很可能既不是 PIC,也不符合您的目标架构。最好的办法是自己重建该库,确保静态构建是 PIC(是的,静态库也可以是 PIC)并匹配您的目标架构。
    • 要创建共享库而不是可执行文件,您必须将 -shared 添加到上述行
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢@jilles!我正在做你说的。我查看了源代码附带的 mini xml 的 makefile。我发现该库已经在使用 -fPIC 标志进行编译。因此,当我使用 libmxml.a(使用 -fPIC 编译)编译我的库时,当我尝试使用我的库运行任何应用程序时,它会得到一些未定义的 mxml 符号。现在,当我将 mxml 的所有 .o 文件复制到目录的源文件夹并编译包括 mxml 对象和库对象在内的库时,我可以运行使用我的库构建的应用程序,而不依赖于 libmxml。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多