gcc -static是否会影响所有提供的库?

时间:2019-01-11 11:32:02

标签: linux gcc ld

gcc的-static选项仅影响紧随其后的一个库还是影响命令行上提供的所有库?

g++ -static -lutils1 -lutils2

1 个答案:

答案 0 :(得分:2)

GGC的-static linkage option 防止与共享库的链接。所以 链接所需的 all 库必须是静态的。的 链接程序必须能够找到静态库来解析所有的-lname选项, 传递,以及GCC静默的所有默认库的静态版本 附加到链接。

这是-static选项的预期用途,尽管可以使其更加灵活。

GCC的-static选项的工作原理是,使GCC将选项-static|-Bstatic传递给链接器(ld),位于 生成的ld命令行中位于以下所有库之前的位置 链接。

链接器的 -static选项与GCC的含义不同。来自the ld manual

  

-静态

     

-dn

     

-non_shared

     

-静态

     

不链接共享库。这仅在支持共享库的平台上才有意义。   该选项的不同变体是为了与各种系统兼容。   您可以在命令行上多次使用此选项:它会影响库搜索其后的-l选项。

(我的重点)

因此,链接器的-static|-Bstatic选项意味着:不要链接任何共享库,除非另行通知。以后 在ld命令行中,您可以使用选项-static|-BStatic来取消-Bdynamic的效果, 从那时起,直到另行通知,动态链接库才能再次链接。

与链接器不同,GCC没有选项可以取消其-static选项的作用。但是,GCC允许您通过-Wl,<ld-options>将任意选项传递给ld。 因此,您实际上可以 在以后的命令行中取消GCC的-static选项,如下所示:

gcc -static -o prog main.o -lfoo -lbar -Wl,-Bdynamic -lgum ...

这将生成一个链接命令行,其中必须将-lfoo-lbar解析为 静态库,但是-lgum和任何后续库都可以解析为 像往常一样是共享库或静态库。虽然如果您想“打开/关闭” 像这样在命令行中的不同点进行动态链接,将会更加 自然不使用GCC的-static选项,而是编写等效项:

gcc -o prog main.o -Wl,-Bstatic -lfoo -lbar -Wl,-Bdynamic -lgum ...