使用
-Wl,-Bstatic
来告诉 gcc
我想静态链接哪些库,这对我来说感觉很奇怪。毕竟我直接告诉gcc
有关与库链接的所有其他信息(-Ldir
,-llibname
)。
是否可以直接告诉 gcc 驱动程序应该静态链接哪些库?
澄清:我知道如果某个库仅存在于静态版本中,它将在没有
-Wl,-Bstatic
的情况下使用它,但我想暗示gcc
更喜欢静态库。我也知道直接指定库文件会与其链接,但我更喜欢保持包含静态和动态库的语义相同。
使用
-l:
而不是 -l
。例如 -l:libXYZ.a
与 libXYZ.a
链接。请注意,lib
和 .a
已写出,而不是 -lXYZ
,后者会自动扩展为 libXYZ.so
/libXYZ.a
。
它是 GNU ld
链接器的选项:
...如果 namespec 的形式为-l namespec
,则:filename
将在库路径中搜索名为 filename 的文件,否则它将在库路径中搜索名为ld
的文件。 ...在 ELF ...系统上,libnamespec.a
将在目录中搜索名为ld
的库,然后再搜索名为libnamespec.so
的库。 ...请注意,此行为不适用于libnamespec.a
,它始终指定一个名为 filename 的文件。”:filename
(自 binutils 2.18)
请注意,这仅适用于 GNU 链接器。如果您的
ld
不是 GNU 的,那么您就不走运了。
您可以在链接命令中添加
.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上)。