使用 -Wl,-Bstatic来告诉 gcc我想静态地链接哪些库,这让我感觉很奇怪。毕竟我直接告诉 gcc所有其他关于链接库的信息(-Ldir,-llibname)。
-Wl,-Bstatic
gcc
-Ldir
-llibname
是否可以直接告诉 gcc 驱动程序应该静态链接哪些库?
澄清: 我知道如果某个库只存在于静态版本中,它将不使用 -Wl,-Bstatic,但我想暗示 gcc更喜欢静态库。我还知道直接指定库文件会与之链接,但是我倾向于保持语义不变,以便包含静态和动态库。
可以在链接命令中添加. a 文件:
gcc yourfiles /path/to/library/libLIBRARY.a
但这并不是说与 gcc 驱动程序,但与 ld连接器作为选项,如 -Wl,anything是。
ld
-Wl,anything
当您告诉 gcc 或 ld -Ldir -lLIBRARY时,链接器将检查库的静态和动态版本(您可以看到使用 -Wl,--verbose的进程)。要更改检查的库类型的顺序,可以使用 -Wl,-Bstatic和 -Wl,-Bdynamic。这是 gnu LD: http://linux.die.net/man/1/ld的手册页
-Ldir -lLIBRARY
-Wl,--verbose
-Wl,-Bdynamic
要将程序动态地链接到 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。
-l:
-l
-l:libXYZ.a
libXYZ.a
lib
.a
-lXYZ
libXYZ.so
这是一个 GNU ld链接器的选项:
如果 名称规范是 :filename的形式,ld将在库路径中搜索一个名为 文件名的文件,否则它将在库路径中搜索一个名为 libnamespec.a的文件。... 在 ELF... 系统中,ld会先在目录中搜索一个名为 libnamespec.so的库,然后再搜索一个名为 libnamespec.a的库。... 请注意,这种行为不适用于 :filename,它总是指定一个名为 文件名的文件。”
:filename
libnamespec.a
libnamespec.so
(由 Binutils 2.18开始)
请注意,这只适用于 GNU 链接器。如果您的 ld不是 GNU 的,那么您就不走运了。