gcc如何链接目标文件和库文件 - 有什么区别?

3

假设有这样一个命令:

g++ main.o somefile.o -lc -o main

链接目标文件somefile.o和链接库libc.a有什么区别?

默认情况下,共享对象库 libc6.so 通过 -lc 进行链接,并在运行时完全链接。另请参阅 http://tldp.org/HOWTO/Program-Library-HOWTO/。 - Basile Starynkevitch
1个回答

4

以“.a”结尾的文件是归档文件,它们基本上包含一组“.o”文件。因此,假设“libc.a”包含“c1.o”,“c2.o”和“c3.o”,你的命令基本上相当于解压“libc.a”,然后调用:

g++ main.o somefile.o c1.o c2.o c3.o -o main

请注意,“.a”中包含的对象仅在需要时包括,即如果其他“.o”的至少一个符号引用了它们。

3
如果从 c?.o 中不需要符号,则会有一个微妙的差别,那么该目标文件将不会被包含在链接中,如果我没记错的话。 - rodrigo
1
另外,.a不是一种压缩格式。它的组成部分只是“未归档”的。 - Fred Foo
@larsmans:我重新表述了我的答案,以避免暗示压缩。感谢您的评论。 - user1202136
如果您将@rodrigo的评论添加到答案中,则会得到+1。这非常重要;有些人构建.a文件,其中包含可选模块,以便链接器找出实际需要哪些模块并简化构建脚本(显然会牺牲速度)。 - Fred Foo
@larsmans 能否提供一下相关的文献参考呢?我也记得听说过这个,但找不到记录在哪里了。 - user1202136
@user1202136:这很容易测试。编译一个打印“Hello”的函数和一个打印“world”的函数,将它们放在“libhw.a”中,然后使用两个不同的程序链接它们,一个调用第一个函数,另一个打印第二个函数。在程序上运行“strings”,你会发现只有一个字符串出现在任何一个程序中。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接