直接告诉gcc静态链接库

Ela*_*ich 116 linker gcc dynamic-linking static-libraries

我觉得很奇怪-Wl,-Bstatic,以便告诉gcc我想要静态链接哪些库.毕竟我gcc直接告诉所有关于链接库的信息(-Ldir,-llibname).

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

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

小智 166

当然可以-l:代替使用-l.例如-l:libXYZ.a要链接libXYZ.a.注意lib写出来,而不是-lXYZ自动扩展到libXYZ.

  • 上帝,如果只有Gnu首先将其作为默认值而不是lib前缀疯狂.哦,我们本可以节省的时间和挫折. (50认同)
  • 实际上,它是`ld`链接器的选项https://sourceware.org/binutils/docs/ld/Options.html"*`-l namespec` ..如果namespec的格式为:filename,ld将搜索库名为filename的文件的路径,否则它将在库路径中搜索名为libnamespec.a ...的文件,在ELF ..系统上,ld将在搜索名为libnamespec.so的库之前搜索目录,然后搜索名为libnamespec.a的库.请注意,此行为不适用于:filename,它始终指定名为filename.*"的文件.自binutils 2.18起 - https://sourceware.org/binutils/docs-2.18/ld/Options.html (13认同)
  • GNU无处负责此接口,它继承自Unix工具链. (9认同)
  • 拉德克,这个`-l:`选项有记录吗?我需要使用哪个版本的gcc? (6认同)

osg*_*sgx 117

您可以在链接命令中添加.a文件:

  gcc yourfiles /path/to/library/libLIBRARY.a
Run Code Online (Sandbox Code Playgroud)

但这不是与gcc驱动程序交谈,而是使用ld链接器作为选项-Wl,anything.

当你告诉gcc或ld"-Ldir -lLIBRARY"时,链接器将检查库的静态和动态版本(你可以看到一个进程-Ldir -lLIBRARY).要更改已检查的库类型的顺序,您可以使用-Wl,--verbose-Wl,-Bstatic.这是gnu LD的手册页:http://linux.die.net/man/1/ld

要将程序与lib1,lib3动态和lib2静态链接,请使用此类gcc调用:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
Run Code Online (Sandbox Code Playgroud)

假设ld的默认设置是使用动态库(它在Linux上).

  • 链接(以及dyn/static libs的搜索)由链接器完成,因此,您必须使用链接器选项.`-l`和`-L`也是链接器选项. (11认同)
  • Elazar Leibovich,但是`gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3`就可以了. (6认同)
  • @TorKlingberg,Variant 1`/path/to/library/libLIBRARY.a`需要写入完整路径,变体2`-WI,-Bstatic -llib2 -Wl,-Bdynamic`只是很长并添加2个额外选项并假设默认模式为Bdynamic,并且接受的变体3`-l:libXYZ.a`很短并且正常工作.这三个都适用于许多情况,而变体2在链接静态程序时可能不起作用.根据我的理解,lib的实际链接步骤在所有变体中都是相同的. (5认同)
  • 由于`gcc yourfiles/path/to/library/libLIBRARY.a`或`-Wl,-Bstatic`,这个答案是否被赞成? (3认同)
  • 简短版本:当前的`gcc`无法做到这一点. (2认同)
  • 编译由编译器完成,但编译结果不是可执行文件。编译生成的目标文件必须通过链接器与库链接。因此,如果您希望不仅通过 binutils `ld` 或 `gold` 链接您的程序,您可以使用 `libtool`。 (2认同)