我在一个大项目中工作。现在遇到链接错误。
可以通过解决方法避免此错误,但我无法弄清楚它为什么会起作用。
这是与我的问题相关的文件结构:
项目 |-package_a |--a.cpp |--... |-package_b |--b.cpp |--c.cpp |--... |-package_others
package_a 中的所有 *.o 将被打包到 aa 中,而 package_b 中的 *.o 将被打包到 ba
"g++ -o exec -Bstatic b.a a.a ..."
用于生成二进制文件。
在 package_b/b.cpp 中,我添加了一个函数 foo()。
在 package_a/a.cpp 中,我使用了这个函数。
但是在这里我会得到一个链接错误,说 foo() 在 ao 中的未定义引用
我可以验证(通过 objdump) foo() 已经在 bo
通过将链接命令更改为"g++ -o exec -Bstatic a.a b.a ..."
,可以成功构建二进制文件。我现在明白链接器确实关心链接列表中的顺序。但请理解这是一个大项目,我无权更改项目配置,所以必须保持原始链接顺序。
然后我在 package_b/c.cpp 中添加了一个虚拟函数 bar(),它只调用 foo(),然后原始"g++ -o exec -Bstatic b.a a.a ..."
函数将运行而不会出现任何链接错误。
谁能告诉我为什么在这种情况下只在同一个包中添加一个虚拟函数会起作用?
我正在使用 g++ 4.4.4 和 linux 2.6.18-194.el5
任何评论将不胜感激