我有未定义符号的链接错误,例如
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包含一个错误认为它可以跳过的所需库?
答案 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丢弃了要链接的库的详细输出列表中的链接器脚本命令文件。一个简单的解决方法是替换链接器脚本输入命令文件,而不是文件的副本(或符号链接)。