直接告诉gcc静态链接库


133

使用它-Wl,-Bstatic来告诉gcc我要静态链接的库对我来说很奇怪。毕竟我告诉gcc直接有关与库(链接的所有其他信息-Ldir-llibname)。

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

澄清:我知道,如果某个库仅存在于静态版本中,它将在不使用的情况下使用它-Wl,-Bstatic,但是我想暗示gcc更喜欢静态库。我也知道直接指定库文件将与它链接,但是我更喜欢保持包含静态库和动态库的语义相同。

Answers:


188

当然可以使用-l:代替-l。例如-l:libXYZ.a与链接libXYZ.a。请注意lib所写的内容,而不是将-lXYZ其自动扩展为libXYZ


62
上帝,如果只有Gnu首先将其设置为默认值,而不是lib前缀madness。噢,我们本可以节省的时间和沮丧。
Timmmm 2015年

9
Radek,是否已记录此-l:选项?我需要使用哪个版本的gcc?
osgx

18
实际上,它是ld链接器sourceware.org/binutils/docs/ld/Options.html-l namespec。的选项。如果namespec的格式为:filename,则ld将在库路径中搜索名为filename的文件,否则它将在库中搜索在ELF ..系统上名为libnamespec.a。..的文件的路径中,ld将在目录中搜索名为libnamespec.so的库,然后再搜索名为libnamespec.a。..的库。请注意,此行为不适用于:filename ,它始终指定一个名为filename的文件。从binutils 2.18开始-sourceware.org/binutils/docs-2.18/ld/Options.html
osgx

17
GNU无处负责此接口,它是从Unix工具链继承的。
akim

真可惜,这在非GNU链接器中不起作用。这是“强制” LDLIBS和类似配置选项以查找静态库的好方法,而无需怪异的链接标志解决方法。
nneonneo '18

130

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


3
简短版:无法使用current做到这一点gcc
Elazar Leibovich

7
Elazar Leibovich,但是gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3可以解决这个问题。
osgx 2011年

13
链接(和dyn / static库的搜索)由链接器完成,因此,您必须使用链接器选项。-l并且-L是链接器选项了。
osgx 2011年

3
是因为gcc yourfiles /path/to/library/libLIBRARY.a还是否决了这个答案-Wl,-Bstatic
Tor Klingberg

7
@TorKlingberg,变体1 /path/to/library/libLIBRARY.a需要编写完整路径,变体2 -Wl,-Bstatic -llib2 -Wl,-Bdynamic只是很长,并添加了2个附加选项,并假定默认模式为Bdynamic,而可接受的变体3 -l:libXYZ.a很短并且可以正常工作。这三种方法在很多情况下都可以使用,而链接静态程序时,变体2可能无法使用。据我了解,lib的实际链接步骤在所有变体中都是相同的。
osgx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.