请解释此链接错误:在.rodata部分中引用

时间:2011-03-17 01:32:02

标签: c++ linux linker g++ suse

我正在使用32位SLES10机器进行构建。使用GCC 3.4.2

以下是示例错误

`.L8245' referenced in section `.rodata' of CMakeFiles/myproj.dir/c++/util/MyObj.o: defined in discarded section
 `.gnu.linkonce.t._ZN5boost9re_detail9reg_grep2INS0_21grep_search_predicateIPKcSaIcEEES4_cNS_12regex_traitsIcEES5_S5_EEjT_T0_SA_RKNS_14reg_expressionIT1_T2_T3_EEjT4_' of CMakeFiles/myproj.dir/c++/util/MyObj.o

2 个答案:

答案 0 :(得分:6)

这通常是由于两个不同的.cpp使用不同的编译器开关编译 - 但也使用相同的模板。生成的模板实例化可能在它们定义/引用的内容上有所不同,如果所选的实例化没有定义/引用与丢弃的实例完全相同的符号,则可能会出现此错误。

验证所有.cpp是使用完全相同的编译器开关和定义编译的。如果无法做到这一点,请重新排序链接器命令行上的.obj文件,特别是尝试将错误消息中提到的.obj文件移动到.obj文件列表的末尾或开头。

编辑:

此外,如果您要链接预构建的c ++库,请查看是否可以复制用于构建这些库的编译器开关。

答案 1 :(得分:3)

这可能是由于使用了较新版本的binutils。 binutils版本2.15将此视为非致命错误,但更新版本的binutils因此链接开始失败。有关类似报告,请参阅https://bugzilla.redhat.com/show_bug.cgi?id=191618

在我的情况下,我能够通过明确使用binutils 2.16.1而不是binutils 2.17来再次链接。