g++在处理.a文件和.o文件时的区别?

简单的说,就是

g++ A.o B.o C.o -o a.out

ar rv libpack.a A.o B.o
g++ C.o libpack.a -o a.out

或者

ar rv libpack.a A.o B.o
g++ C.o -o a.out -lpack

有什么区别,对最终的行为有什么影响?我只知道.a就是多个.o打个包,然后加个索引之类,但是在输送给g++的时候,有什么影响?

链接器在处理.a文件的时候,会自动忽略那些没有被引用的项,以保证链接结果中没有太多无用的代码
而在处理.o文件的时候,则是你给它什么就链接什么

gtest的使用并没有使用显式的引用,因此会被链接器忽略。gtest具体是如何找到测试用例的就不清楚了,需要看源代码吧。

对这个问题的解决方案有两种:

  • 一开始就不要生成.a

  • .a解开,用一堆.o代替

  • 在链接TEST的.a时,用这个选项-Wl,--whole-archive libtest.a,它可以强制引入libtest.a中的所有符号