使用它-Wl,-Bstatic
来告诉gcc
我要静态链接的库对我来说很奇怪。毕竟我告诉gcc
直接有关与库(链接的所有其他信息-Ldir
,-llibname
)。
是否可以直接告诉gcc驱动程序应静态链接哪些库?
澄清:我知道,如果某个库仅存在于静态版本中,它将在不使用的情况下使用它-Wl,-Bstatic
,但是我想暗示gcc
更喜欢静态库。我也知道直接指定库文件将与它链接,但是我更喜欢保持包含静态库和动态库的语义相同。
使用它-Wl,-Bstatic
来告诉gcc
我要静态链接的库对我来说很奇怪。毕竟我告诉gcc
直接有关与库(链接的所有其他信息-Ldir
,-llibname
)。
是否可以直接告诉gcc驱动程序应静态链接哪些库?
澄清:我知道,如果某个库仅存在于静态版本中,它将在不使用的情况下使用它-Wl,-Bstatic
,但是我想暗示gcc
更喜欢静态库。我也知道直接指定库文件将与它链接,但是我更喜欢保持包含静态库和动态库的语义相同。
Answers:
当然可以使用-l:
代替-l
。例如-l:libXYZ.a
与链接libXYZ.a
。请注意lib
所写的内容,而不是将-lXYZ
其自动扩展为libXYZ
。
-l:
选项?我需要使用哪个版本的gcc?
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
您可以在链接命令中添加.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的实际链接步骤在所有变体中都是相同的。