Пожалуйста, объясните эту ошибку связывания: ссылка в разделе .rodata - PullRequest
5 голосов
/ 17 марта 2011

Я делаю сборку на 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 ]

6 голосов
/ 17 марта 2011

Обычно это происходит из-за того, что 2 разных .cpp компилируются с разными ключами компилятора, но также используют одни и те же шаблоны. Сгенерированные экземпляры шаблонов могут отличаться тем, что они определяют / ссылаются, и если выбранный экземпляр не определяет / ссылается на те же символы, что и те, которые были отброшены, вы можете получить эту ошибку.

Проверьте, что все ваши .cpp скомпилированы с точно такими же ключами и определениями компилятора. Если это невозможно, измените порядок файлов .obj в командной строке компоновщика, в частности попробуйте переместить файлы .obj, упомянутые в сообщении об ошибке, в конец или начало списка файлов .obj.

EDIT:

Кроме того, если вы ссылаетесь на готовые библиотеки c ++, посмотрите, можете ли вы продублировать переключатели компилятора, используемые для сборки этих библиотек.

3 голосов
/ 15 августа 2011

Это может быть связано с использованием более новой версии binutils.В версии 2.15 binutils это воспринималось как нефатальная ошибка, но более поздние версии binutils изменились, и поэтому ссылка начала давать сбой.См. https://bugzilla.redhat.com/show_bug.cgi?id=191618 с аналогичным отчетом.

В моем случае я смог снова связать объекты, явно используя binutils 2.16.1 вместо binutils 2.17.

...