2017-04-06 14 views
32

유사한 질문이 여러 개 발견되었지만 (예 : this, that 또는 this) 문제가 해결되지 않았습니다.g ++ 정의되지 않은 참조 기호가 * .so 파일에 있음에도 불구하고

$nm libgnss_system_parameters_dyn.so | c++filt |grep Gps_Eph 

생성자 있어야하는데 기호 Gps_Ephemeris::Gps_Ephemeris()를 포함 : 나는로 표시된 바와 같이, 것을 (gnss-sdr의 핵심에서) A * .so를 파일이 있습니다. 나 또한 cmake을 시도

/tmp/ccHCvldG.o: In function `main': 
main.cpp:(.text+0x33): undefined reference to `Gps_Ephemeris::Gps_Ephemeris()' 
collect2: error: ld returned 1 exit status 

:

#include <iostream> 
#include <core/system_parameters/gps_ephemeris.h> 

int main(int argc,const char* argv[]) 
{ 
    Gps_Ephemeris ge; 
    return 0; 
} 

내가 컴파일 :

g++ main.cpp -std=c++0x -I some_include_path -L some_lib_path -l gnss_system_parameters_dyn` 

링커는 다음 불평

나는 최소한의 코드를 작성했습니다 그러나 그것이 생성 한 선은 그것과 비슷했습니다 (단지을 추가했습니다).), 여전히 정확한 링커 오류가 발생했습니다.

라이브러리와 최소한의 코드 모두 동일한 플래그와 동일한 C++ 0x 표준을 사용하여 동일한 컴파일러 (g ++ - 5)로 컴파일됩니다.

nm --demangle --defined-only --extern-only libgnss_system_parameters.so |grep Gps_Eph 

은 아무것도 출력하지 않습니다 :


맥심 Egorushkin 라인으로 답을 주소.

add_library(lib_name SHARED ${sources_etc}) #for the *.so 
add_library(lib_name_2 ${sources_etc}) #for the *.a 

: 모두 다음과 같은 방법으로, cmake에 의해 생성되는 것을 알고

00000000000006b0 T Gps_Ephemeris::Gps_Ephemeris() 
00000000000006b0 T Gps_Ephemeris::Gps_Ephemeris() 

: 그러나, 기호가 정적 라이브러리 ( * 표시로 .a 라이브러리)에 정의되어 있습니다 해당 라이브러리에 포함되거나 정의 된 기호에는 차이가 없어야합니다. 맞습니까? 나는 cmake에서 아무 것도 눈치 채지 못했습니다.의 설명서는 add_library입니다. 나는 명백한 것을 놓치고 있는가?

+3

출력에 _Gps_Ephemeris :: Gps_Ephermeris() _ 기호가 포함되어 있지만 실제 출력은 표시되지 않는다고하셨습니다. 이것은 관련성이 있고 유용 할 것입니다. 또한, 당신은 분명히 그 심볼을 복사하고 붙여 넣지 않았습니다. 왜냐하면 당신은 그것을 잘못 짚었 기 때문입니다. 나는 당신이 당신의 요약에서 제외해야 할 것이 무엇인지를 신뢰할 수있는 판사라면, 당신은 아마도 이런 질문을하지 않을 것이기 때문에 이런 종류의 서면 요약을하는 것을 믿지 않는다. – Useless

+0

그 점을 알아 주셔서 고마워, 나는 고쳤다. 저는 주로 고급 컴퓨터 비전을 수행합니다. 그렇습니다. 나는 제외되어야 할 것이 무엇인지 판단하기에는 자격이 없다고 생각합니다. 최대한 빨리 출력을 게시 할 것입니다. – Ash

+0

소스 코드를 보지 않고 동일한 소스에서 빌드 된 .so 및 .a가 다른 기호를 내보내는 이유를 알기 어렵습니다. 조건부 컴파일이 포함될 수 있습니다. –

답변

17

.so이 심볼을 내보내는 지 확인하는 올바른 방법은 nm --demangle --dynamic --defined-only --extern-only <lib.so> | grep <symbol>입니다.

--defined-only이 없으면 명령에 이 표시되지 않습니다. 정의되지 않음 기호가 표시됩니다.

--extern-only이 없으면 연결에 사용할 수없는 내부 연결의 기호도 표시됩니다.

Gps_Ephemeris::Gps_Ephermeris()이 (가) libgnss_system_parameters_dyn.so을 연결하여 해결되지 않았기 때문에 다른 라이브러리를 연결해야하는 것 같습니다. 시작하는 좋은 방법은 라이브러리의 문서와 예제입니다.

+0

고마워요! 당신이 옳았. 그러나 심볼은 정적 라이브러리 (equivalent)에 있습니다. 끝에 몇 가지 정보로 질문을 업데이트했습니다. 좀 봐 주시겠습니까? – Ash

1

나는 과거에이 유형의 오류가 포함 파일에서 적절한 문자 집합이 없음으로 인해 발생한다는 것을 발견했습니다.

+1

'extern "C"link가 생성자를 처리하는 방법을 설명해 주시겠습니까? –

+0

그렇지 않습니다. 그들은 C의 일부가 아니라 C++의 일부입니다. – Nicole