2011-03-17 5 views
5

32 비트 SLES10 시스템에서 빌드를 수행하고 있습니다. 여기 GCC 3.4.2이 연결 오류에 대해 설명하십시오 : .rodata 섹션에서 참조하십시오.

를 사용하여 샘플 오류

`.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 

답변

5

에게 않습니다 인해 2 가지의 .cpp의 서로 다른 컴파일러 스위치 컴파일되는 통상적 인 -뿐만 아니라, 동일한 템플릿을 사용. 생성 된 템플릿 인스턴스화는 정의/참조 내용이 다를 수 있으며 선택된 인스턴스화가 폐기 된 것과 동일한 심볼을 정의하거나 참조하지 않으면이 오류가 발생할 수 있습니다.

모든 .cpp 파일이 동일한 컴파일러 스위치로 컴파일되고 정의되는지 확인하십시오. 이것이 가능하지 않으면 링커 명령 줄에서 .obj 파일 순서를 바꾸십시오. 특히 .obj 파일 목록의 끝이나 맨 앞에 오류 메시지에 언급 된 .obj 파일을 옮겨보십시오.

편집 :이 라이브러리를 구축에 사용되는 컴파일러 스위치를 복제 할 수있는 경우

또한

, 당신이 미리 만들어진 C에 연결하는 경우 ++ 라이브러리를 참조하십시오.

+0

+1 OS (내 경우에는 우분투)를 업데이트하는 경우 새 gcc/ld로 다시 작성하기 전에 깨끗하게 정리하십시오. 이전에 구축 한 타사 라이브러리를 다시 빌드해야 할 수도 있습니다. – kfmfe04

3

이것은 binutils의 최신 버전을 사용했기 때문일 수 있습니다. binutils 버전 2.15는 이것을 치명적이지 않은 오류로 처리했지만 이후 버전의 binutils가 변경되어 링크가 시작되지 않았습니다. 유사한 보고서는 https://bugzilla.redhat.com/show_bug.cgi?id=191618을 참조하십시오.

내 경우에는 binutils 2.17 대신에 binutils 2.16.1을 명시 적으로 사용하여 링크 할 수있었습니다.

관련 문제