5

我正在 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
4

2 回答 2

6

这通常是由于使用不同的编译器开关编译了 2 个不同的 .cpp - 但也使用相同的模板。生成的模板实例在定义/引用的内容上可能有所不同,如果选择的实例未定义/引用与被丢弃的符号完全相同的符号,您可能会收到此错误。

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

编辑:

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

于 2011-03-17T01:47:03.453 回答
3

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

就我而言,我能够通过明确使用 binutils 2.16.1 而不是 binutils 2.17 来再次链接。

于 2011-08-15T14:17:01.643 回答