ChatGPT解决这个技术问题 Extra ChatGPT

直接告诉 gcc 静态链接库

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

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

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


J
John Kugelman

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

它是一个 option of the GNU ld linker

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

(自 binutils 2.18 起)

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


上帝,要是 Gnu 一开始就把它设为默认值,而不是 lib 前缀的疯狂就好了。哦,我们本来可以节省的时间和挫折。
GNU 不负责这个接口,它继承自 Unix 工具链。
p
pevik

您可以在链接命令中添加 .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 的实际链接步骤在所有变体中都是相同的。