2010-04-15 9 views
7

wxWidgets에 대해 프로그램을 작성하려고하는데 링커 오류가 발생합니다. 그게 무슨 뜻인지 정말로 알고 싶습니다. 오류 : 오류가 libwx_baseu-2.8.so에 왜ELF : linking : .so 파일에서 정의되지 않은 참조를 얻는 이유는 무엇입니까?

/usr/lib/libwx_baseu-2.8.so: undefined reference to `std::ctype<char>::_M_widen_init() [email protected]_3.4.11' 

는 내가 이해하지 못하는 것은. 난 .so 파일의 모든 심볼을 해결했다고 생각하고, 여전히 링크가 필요한 파일 인 .o과는 반대이다.

나는 .soldd 때, 나는 모든 링크 된 라이브러리를 해결할 수 있습니다 얻을, 그래서 거기에 아무 문제가 없다 :

$ ldd /usr/lib/libwx_baseu-2.8.so 
linux-gate.so.1 => (0x00476000) 
libz.so.1 => /lib/libz.so.1 (0x00d9c000) 
libdl.so.2 => /lib/libdl.so.2 (0x002a8000) 
libm.so.6 => /lib/libm.so.6 (0x00759000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x002ad000) 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0068d000) 
libpthread.so.0 => /lib/libpthread.so.0 (0x006f0000) 
libc.so.6 => /lib/libc.so.6 (0x00477000) 
/lib/ld-linux.so.2 (0x007f6000) 

.so 파일이이 경우에 (제대로 컴파일되지 않았 음을 의미합니까, 그것은이다 내 배포 패키지의 버그) 또는 내 특정 프로그램에 대한 링커 명령 줄에 누락 된 라이브러리가 있음을 의미합니까?

또한 ELF 파일에서 정의되지 않은 기호에 대한 목록을 얻는 방법을 알고 계십니까? 나는 readelf -s을 시도했지만 빠진 기호를 찾을 수 없습니다.

감사합니다.

마일드

+0

링크하는 동안 문제가 발생하면 정확한 링커 명령 행을 게시 한 경우 도움이 될 수 있습니다. – ndim

답변

3

프로그램을 링크 할 때 일부 라이브러리에 연결하지 않아도된다고 생각합니다.

당신은 .so를 일부 정적 라이브러리에 연결되어있는 경우 당신은 당신의 .so를

에 링크 모든 공유 라이브러리 프로그램에 연결해야합니다 -이 필요한 모든 문자 경우 그들에게 연결 프로그램에 필요하지 않은 것 .so를에서 발견되는

당신은 오브젝트 파일, 라이브러리 또는 이진

편집의 기호를 볼 수 nm 리눅스 명령을 사용할 수 있습니다
귀하의 특정 문제에 대해 설명 할 수 있습니다 : http://old.nabble.com/-Bug-49433--gcc4.4,-NEW:-gcc4.4-misses-std::endl-implementation-at--O2%2B-td22836171.html

8

I thought that .so files had all its symbols resolved, contrary to .o files that still need linking.

공유 라이브러리는 확인을하고, 불완전 할 수 있습니다.

do you know how I can get a list on undefined symbols in an ELF file

사용

nm -C -u libwx_baseu-2.8.so

+0

고맙습니다 만, 그것은 분명히 누락 된 기호가 없습니다. $ nm : /usr/lib/libwx_baseu-2.8.so : 기호 없음 nm : /usr/lib/libwx_baseu-2.8.so : no 기호들 – Mildred

4

다른 공유 라이브러리 (예를 들어, 링크 libstdc++.so에 대한 libwx_baseu-2.8.so), libwx_baseu에서 사용 libstdc++에서 제공하는 문자 버전 링커 기록에 대해 공유 라이브러리를 링크합니다.

런타임에 다른 버전의 기호 libstdc++ (동일한 버전 기호를 제공하지 않음)을 사용하면 선호하는 오류 메시지가 표시되고 프로그램이 전혀 실행되지 않습니다. 나중에 "신비"추락에 더 좋음).

하지만 여기에서는 실행 파일을 링크하려고합니다. 즉, (정적) 링커가 런타임에 필요한 모든 심볼을 찾으려고한다는 것입니다.다시 말하지만 실행 파일을 다른 (이전) libstdc++.so에 연결하면 연결이 실패합니다.
중 다른 시스템 (GCC의 최신 버전 하나)에 libwx_baseu-2.8.so를 연결하고, 현재 시스템에 복사 또는 - -
당신은 함께 libwx_baseu-2.8.so을 연결 한 :

는 두 가지 일반적인 근본 원인이다 더 새로운 GCC를 동일한 시스템에 설치했지만, 이제 실행 파일을 구형 GCC와 연결하려고합니다.

1

시도해보십시오. -fno-inline 을 Makefile의 플래그에 넣으십시오. 기본적으로 g ++ 4.4에는 문제가 없습니다. 넣거나 -O 옵션을 제거하십시오. 내가 가진 것과 같은 문제가 해결되었습니다.

관련 문제