我正在一个大项目中工作。现在遇到链接错误。
这个错误可以通过解决方法避免,但我无法弄清楚它为什么起作用。g ++链接错误 - 为什么解决方法可行
下面是有关我的问题的文件结构:
project |-package_a |--a.cpp |--... |-package_b |--b.cpp |--c.cpp |--... |-package_others
所有*在package_a的.o将被装在到AA和*的.o在package_b 被打成BA
"g++ -o exec -Bstatic b.a a.a ..."
用于生成二进制文件。
在package_b/b.cpp中,我添加了一个函数foo()。
而在package_a/a.cpp中,我使用了这个函数。
但我在这里会得到一个链接错误,说undefined参考foo()在a.o
我可以验证(通过objdump)foo()已经在b.o.
通过将链接命令更改为"g++ -o exec -Bstatic a.a b.a ..."
,可以成功构建二进制文件。我现在明白链接器确实关心链接列表中的the order。但请理解这是一个大项目,我没有权限更改项目配置,因此必须保留原始链接顺序。
然后我说在package_b/c.cpp虚拟函数bar(),它什么也不做 只是调用foo(),那么原来"g++ -o exec -Bstatic b.a a.a ..."
将运行 通过没有任何链接错误。
任何人都可以告诉我为什么只是在 中添加一个虚拟函数,在这种情况下,同一个包可以工作吗?
我使用克++ 4.4.4和Linux 2.6.18-194.el5
任何评论将被理解
'可能是package_b/c.cpp的另一个函数已经被引用,并且链接器带有bar()(因为它们在同一个文件中),并且这个引用的foo()随后被包含在输出中,太。它成功了,因为foo也在b.a中。'
我仍然怀疑它,你的意思是package_b/c.cpp在链接器处理a.a之前已经被引用了吗?但是当它引用package_b/c.cpp中的那些符号时,怎么可能没有链接错误? –
@ user1033573:当一个目标文件引用当前库/档案中的一个符号时,它就会起作用,你不需要做任何特殊的事情。或者我误解了你的问题? – jpalecek
你说c.cpp中的另一个函数,比如bar2()被引用,并且链接器带上了bar()。我的理解是,这发生在连接器交付a.a之前,对吗?但为什么连接器不抱怨bar2()没有定义,因为b.a仍然在链接序列中。 –