gcc -v显示需要-ltbb被跳过

时间:2015-03-27 21:59:03

标签: c++ gcc undefined-reference

我有未定义符号的链接错误,例如

undefined reference to `vtable for tbb::task'

我的gcc选项(通过mainwin mwdip wrapper传递)包含以下部分:

-lxerces-c -ltbb -lboost_chrono

当我用-v包含详细输出时,我在详细输出中看到以下部分:

-lxerces-c -lboost_chrono

为什么详细输出会跳过某些-l args?

gcc是否会尝试忽略它认为不需要的库?有没有办法让我强制gcc包含一个错误认为它可以跳过的所需库?

2 个答案:

答案 0 :(得分:1)

GCC从右到左处理依赖关系。您链接的库的未定义引用通常意味着在链接tbb之后链接需要tbb的内容(并且链接器不会返回并重新检查{{1}对于新需要的符号)。

答案 1 :(得分:0)

某些链接器包装器无法处理链接器脚本,因此请将libtbb.so链接描述文件替换为libtbb.so.2的副本,例如

cp libtbb.so.2 libtbb.so

libtbb.so文件是包含以下内容的ASCII文本文件:

INPUT (libtbb.so.2)

这是GNU ld linker script command。一些更复杂的构建可能不支持这一点。例如,如果在编译器选项中包含-v,则可以看到mainwin gcc wrapper mwdip丢弃了要链接的库的详细输出列表中的链接器脚本命令文件。一个简单的解决方法是替换链接器脚本输入命令文件,而不是文件的副本(或符号链接)。