为什么gcc链接器对.a文件和.o文件的行为不同

Why does the gcc linker behave differently with .a files and .o files?

本文关键字:文件 链接 为什么 gcc      更新时间:2023-10-16

使用这个关于gcc中链接顺序的好答案中的例子,我尝试了以下操作:

echo 'extern int b; int a = b;' > b.cpp
g++ -c b.cpp -o b.o
ar cr libb.a b.o
echo 'int b;' > d.cpp
g++ -c d.cpp -o d.o
ar cr libd.a d.o
echo 'extern int a; int main() { return a; }' > a.cpp
g++ a.cpp -o a1 d.o b.o # Works
g++ a.cpp -o a2 libd.a libb.a # Fails

如果.a文件只是一个包含一个或多个.o文件的存档文件,为什么与lib*.a文件链接(如原始答案中所述,顺序错误)失败,但直接使用.o文件(按相同顺序)有效?

就链接器而言,静态库和对象文件之间的区别在链接序列中是:-

  • 对象文件将被链接,因为它是对象文件,无论它是否提供可执行文件所需的任何符号的定义。如果你不想要一个对象要链接的文件,不要向链接器提及它。

  • 静态库是要从库并链接(如果需要),其中库中的对象文件是必需的当且仅当它提供了至少一个迄今未定义的定义链接器在早期中出现的对象文件或库中观察到的符号链接序列。