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

时间:2016-04-06 10:07:47

标签: c++ gcc linker

使用this great answer中关于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文件(按相同顺序)有效吗?

1 个答案:

答案 0 :(得分:1)

就链接器而言,静态库和目标文件之间存在差异 在连锁序列中是: -

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

  • 静态库是要从中提取的目标文件的存档 库和链接(如果需要),其中库中的目标文件是 required 当且仅当它提供至少一个迄今未定义的定义时 链接器在先前中出现的对象文件或库中观察到的符号 连锁序列。