2011-07-05 165 views
69

使用-Wl,-Bstatic为了告诉gcc我想静态链接哪些库,感觉很奇怪。毕竟我直接告诉gcc所有关于链接库的其他信息(-Ldir,-llibname)。直接告诉gcc静态链接库

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

澄清:我知道,如果只存在于静态版本一定的图书馆,它会使用它,而-Wl,-Bstatic,但我想暗示gcc喜欢静态库。我也知道直接指定库文件会与它链接,但我更愿意保持包含静态和动态库的语义相同。

回答

81

当然有可能使用-l:而不是-l。例如-l:libXYZ.alibXYZ.a链接。注意lib写出,而不是-lXYZ这将自动扩展到libXYZ

+25

上帝,如果只有牛羚已经在第一个地方,而不是lib前缀的疯狂,这是默认的。哦,我们可以节省的时间和挫折。 – Timmmm

+3

Radek,这是'-l:'选项记录?我需要使用哪个版本的gcc? – osgx

+4

实际上,它是'ld'链接器的选项https://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 - https://sourceware.org/binutils/docs-2.18/ld/Options.html – osgx

89

您可以在连接命令添加某文件:

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

+2

简版:当前'gcc'没有办法做到这一点。 –

+3

Elazar Leibovich,但'gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3'就是这么做的。 – osgx

+0

是的,但问题是如何做到这一点,而不诉诸直接'ld'选项。 –