直接告诉gcc静态链接库

问题描述 投票:0回答:2

使用

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

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

澄清:我知道如果某个库仅存在于静态版本中,它将在没有

-Wl,-Bstatic
的情况下使用它,但我想暗示
gcc
更喜欢静态库。我也知道直接指定库文件会与其链接,但我更喜欢保持包含静态和动态库的语义相同。

gcc linker static-libraries dynamic-linking
2个回答
304
投票

使用

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

它是 GNU ld

 链接器的 
选项:

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

(自 binutils 2.18

请注意,这仅适用于 GNU 链接器。如果您的

ld
不是 GNU 的,那么您就不走运了。


174
投票

您可以在链接命令中添加

.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上)。

© www.soinside.com 2019 - 2024. All rights reserved.