使用 -Wl,-Bstatic
来告诉 gcc
我想静态链接哪些库对我来说感觉很奇怪。毕竟我是直接告诉 gcc
与库链接的所有其他信息(-Ldir
、-llibname
)。
是否可以直接告诉 gcc 驱动程序应该静态链接哪些库?
澄清:我知道如果某个库仅存在于静态版本中,它将在没有 -Wl,-Bstatic
的情况下使用它,但我想暗示 gcc
更喜欢静态库。我也知道直接指定库文件会与其链接,但我更喜欢保持包含静态库和动态库的语义相同。
使用 -l:
而不是 -l
。例如 -l:libXYZ.a
与 libXYZ.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,那您就不走运了。
您可以在链接命令中添加 .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
无法做到这一点。
gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
成功了。
-l
和 -L
也是链接器选项。
gcc yourfiles /path/to/library/libLIBRARY.a
或 -Wl,-Bstatic
而被赞成?
/path/to/library/libLIBRARY.a
需要编写完整路径,变体 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamic
很长,并添加了 2 个额外选项并假定默认模式为 Bdynamic,并且接受的变体 3 -l:libXYZ.a
很短并且可以正常工作。这三个都适用于许多情况,而变体 2 在链接静态程序时可能不起作用。据我了解,lib 的实际链接步骤在所有变体中都是相同的。
不定期副业成功案例分享