Linux gcc链接对象文件和库-有什么区别?

Linux gcc链接对象文件和库-有什么区别?,linux,gcc,Linux,Gcc,假设有这样一个命令: g++ main.o somefile.o -lc -o main 链接对象文件somefile.o和链接库libc.a之间有什么区别?以“.a”结尾的文件是归档文件。它们基本上包含一组“.o”s。因此,假设“libc.a”包含“c1.o”、“c2.o”和“c3.o”,则您的命令本质上等同于取消归档“libc.a”,然后调用: g++ main.o somefile.o c1.o c2.o c3.o -o main 请注意,“.a”中包含的对象仅在需要时才包括在内,即,

假设有这样一个命令:

g++ main.o somefile.o -lc -o main
链接对象文件somefile.o和链接库libc.a之间有什么区别?

以“.a”结尾的文件是归档文件。它们基本上包含一组“.o”s。因此,假设“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”引用,“

但有一个细微的区别,如果不需要c?.o中的符号,则该对象不包括在链接IIRC中。此外,
。a
不是压缩格式。它的组成部分只是“未归档”。@larsmans:我重新编写了我的答案,以避免暗示压缩。感谢您的评论。如果您在答案中添加@rodrigo的评论,则+1。这非常关键;有些人构建
.a
文件,其中包含可选模块,以便链接器找出实际需要的模块,并简化构建脚本(显然是以牺牲速度为代价)。@larsmans请您提供一个参考。我记得也听说过它,但找不到它的文档位置。默认情况下,它是共享对象库
libc6。因此
通过
-lc
链接,并且在运行时也完全链接。另见