【问题标题】:Telling gcc directly to link a library statically直接告诉 gcc 静态链接库
【发布时间】:2011-09-28 12:57:56
【问题描述】:

使用-Wl,-Bstatic 告诉gcc 我想静态链接哪些库对我来说感觉很奇怪。毕竟我直接告诉gcc 与库链接的所有其他信息(-Ldir-llibname)。

是否可以直接告诉gcc驱动应该静态链接哪些库?

澄清:我知道如果某个库仅存在于静态版本中,它将在没有-Wl,-Bstatic 的情况下使用它,但我想暗示gcc 更喜欢静态库。我也知道直接指定库文件会与其链接,但我更喜欢保持包含静态库和动态库的语义相同。

【问题讨论】:

    标签: gcc linker static-libraries dynamic-linking


    【解决方案1】:

    使用-l: 而不是-l。例如-l:libXYZ.alibXYZ.a 链接。请注意lib.a 被写出,而不是-lXYZ 会自动扩展为libXYZ.so/libXYZ.a

    这是一个option of the GNU ld linker

    -l namespec ... 如果 namespec 的格式为 :filenameld 将在库路径中搜索名为 filename 的文件,否则它将在库路径中搜索名为 libnamespec.a 的文件。 ... 在 ELF ... 系统上,ld 将在目录中搜索名为 libnamespec.so 的库,然后再搜索名为 libnamespec.a 的库。 ...请注意,此行为不适用于 :filename,它始终指定一个名为 filename 的文件。"

    (自binutils 2.18

    请注意,这只适用于 GNU 链接器。如果你的 ld 不是 GNU 的那你就不走运了。

    【讨论】:

    • 天哪哦,我们本来可以节省时间和挫折。
    • GNU 不负责这个接口,它继承自 Unix 工具链。
    【解决方案2】:

    您可以在链接命令中添加 .a 文件:

      gcc yourfiles /path/to/library/libLIBRARY.a
    

    但这不是与 gcc 驱动程序交谈,而是与 ld 链接器作为选项,如 -Wl,anything 是。

    当您告诉 gcc 或 ld -Ldir -lLIBRARY 时,链接器将检查库的静态和动态版本(您可以看到带有 -Wl,--verbose 的进程)。要更改检查的库类型的顺序,您可以使用-Wl,-Bstatic-Wl,-Bdynamic。这是 gnu LD 的手册页:http://linux.die.net/man/1/ld

    要将您的程序与 lib1、lib3 动态链接和 lib2 静态链接,请使用这样的 gcc 调用:

    gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
    

    假设 ld 的默认设置是使用动态库(在 Linux 上)。

    【讨论】:

    • 短版:当前的gcc 无法做到这一点。
    • Elazar Leibovich,但 gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3 可以解决问题。
    • 链接(和搜索动态/静态库)是由链接器完成的,因此,您必须使用链接器选项。 -l-L 也是链接器选项。
    • 这个答案是否因为gcc yourfiles /path/to/library/libLIBRARY.a-Wl,-Bstatic 而被赞成?
    • @TorKlingberg,变体 1 /path/to/library/libLIBRARY.a 需要写入完整路径,变体 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamic 很长,并添加了 2 个额外选项并假定默认模式为 Bdynamic,并接受变体 3 -l:libXYZ.a很短,而且可以正常工作。这三个都适用于许多情况,而变体 2 在链接静态程序时可能不起作用。据我了解,lib 的实际链接步骤在所有变体中都是相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多