G + + 链接器: 如果存在静态库,强制静态链接?

我有一个链接到许多图书馆的程序。默认情况下,g++倾向于链接到共享库,即使存在相应的归档文件。

如果存在静态归档文件,我如何改变这种偏好,使其更喜欢静态归档文件而不是动态库?

注意,我使用了 -static选项,但是它尝试为所有库查找静态归档,这不是我想要的。

72432 次浏览
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

zliblibfoo作为静态链接,将 libbar作为动态链接。 --as-needed将删除任何未使用的动态库。

当您只想静态地将一个或两个库与其他库(包括系统库)链接为动态时,通常更容易简单地通过静态库的全名来引用它。也就是说,与其使用 -l-L获取 g + + 来解析它所找到的库,不如直接添加到库的完整路径作为输入。使用上面的 g + + 命令,将 main.o应用程序的主程序链接到静态 libz 和 libfoo 以及动态 libbar 和 libglib 等:

    g++ main.o /usr/lib/libz.a /usr/lib/libfoo.a -lbar

编辑: 我刚刚浏览了一下 这个答案,其中包含了更多的细节,并提供了另一种直接指定库的方法(-l:)。