gcc的-static选项仅影响紧随其后的一个库还是影响命令行上提供的所有库?
g++ -static -lutils1 -lutils2
答案 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 ...