告诉 gcc 直接静态链接库

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

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

澄清: 我知道如果某个库只存在于静态版本中,它将不使用 -Wl,-Bstatic,但我想暗示 gcc更喜欢静态库。我还知道直接指定库文件会与之链接,但是我倾向于保持语义不变,以便包含静态和动态库。

266084 次浏览

可以在链接命令中添加. 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 上)。

使用 -l:代替 -l。例如 -l:libXYZ.a链接到 libXYZ.a。注意,lib.a是写出来的,而 -lXYZ会自动扩展到 libXYZ.so/libXYZ.a

这是一个 GNU ld链接器的选项:

如果 名称规范:filename的形式,ld将在库路径中搜索一个名为 文件名的文件,否则它将在库路径中搜索一个名为 libnamespec.a的文件。... 在 ELF... 系统中,ld会先在目录中搜索一个名为 libnamespec.so的库,然后再搜索一个名为 libnamespec.a的库。... 请注意,这种行为不适用于 :filename,它总是指定一个名为 文件名的文件。”

(由 Binutils 2.18开始)

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