2012-11-12 2 views
5

Linux에서 작은 Qt (C++) GUI 응용 프로그램을 빌드하려고하지만 연결되는 Qt 라이브러리의 종속성 누락에 대해 불만을 제기하면서 수많은 링커 오류로 빌드하지 못합니다. Qt 라이브러리에서 ldd를 사용하여 라이브러리가 실제로 있는지 확인했습니다. Linking dependencies of a shared library 을 그리고 그 스레드가 내 정확한 문제를 확인하는 데 도움 동안, 그 스레드의 결론은 내 응용 프로그램에 연결해야한다는 것을 보인다자동으로 공유 라이브러리의 종속성에 연결하는 방법

내 문제는이 글의 토론과 관련이있을 것 같다!

애플리케이션이 다음 명령으로 컴파일된다

g++ -m64 -Wl,-O1 -o Executable some-object.o some-other-object.o -lQtCore -lQtGui -lQtXml -L/usr/lib64 -L/usr/X11R6/lib64 -lpthread 

이것은 다음과 같은 형태의 경고를 발생 실행하고 연결이 결국합니다 ("누락"라이브러리에 정의 된 심볼들) 정의 기준 오류 실패

.../ld: warning: libglib-2.0.so.0, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libpng14.so.14, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libz.so.1, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libfreetype.so.6, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 

등 (총에서 찾을 수 없습니다 (18) 종속성이 있습니다.) 내가 만약 내가 얻을 수

이 컴파일

가서 -lglib, -lpng14, -lz -lfreetype 등을 명시 적으로 추가하십시오. 그러나 언급 한 것처럼 18 가지 종속성이 있습니다. 나는 그렇게하지 않을 것입니다. 나는 그것을 할 필요가없는 것으로 보인다.

정확히 동일한 Linux Distro (openSUSE 12.2)를 사용하는 랩톱 컴퓨터에서 동일한 문제없이 프로젝트를 컴파일했습니다. Qt를 포함한 모든 라이브러리는 배포판 저장소에서 설치되었습니다.

필자는 openSUSE 설치시 설치 문제 일 수 있다고 생각하지만이 문제를 해결하기 위해 어디서부터 시작해야할지 모르겠습니다.

건배, 크레이그

+0

같은 일을 할 수 있다고 생각합니다. 나는 일종의 시스템 구성 오류가 의심된다. 아마도 컴파일러와 binutils와 같은 툴체인을 재설치하는 것이 도움이 될 것입니다 ...? –

+0

Yast 사용 binutils를 제거한 다음 gcc 도구를 다시 설치하면 이제 작동합니다. 답장을 보내 주셔서 감사합니다. –

답변

1

/usr/lib64/libQtGui.so 종속 공유 라이브러리를 찾을 그들 rpaths를 하드 코딩 한 것으로 보인다. 호스트 중 하나에서 필요한 라이브러리는 예상 위치에 있고 다른 호스트에서는 그렇지 않습니다.

elfdump와 같은 것을 사용하면 QT 공유 라이브러리에서 RPATH을 찾아 어디에서 볼 수 있습니다. 그런 다음 링크 명령 행에 -R을 사용하여 라이브러리가 실제로 해당 호스트에 설치된 인 것을 가리킬 수 있습니다 (해당 호스트에이 설치되어 있음).

편집 : 난 당신이 내가 그냥 당신이 모든 종속 라이브러리를 추가 할 필요없이 작동합니다 동의 objdump -x <binary/library> | grep -i rpath

+0

Jamey가 제안한 고정 된 일들은 나를 따라 가면서 답을 구하는 것입니다. openSuse는 elfdump와 함께 제공되지 않습니다. 어떻게이 시스템에서 elf 파일에 RPATH가 내장되어 있는지 알았습니다. 나는 objdump와 readelf를 시도해 보았고 결과물에서 라이브러리에 대한 참조를 찾았지만 RPATH에 대해서는 언급하지 않았다. –

+0

그것에 대해'chrpath'를 사용합니다. 데비안에서는'chrpath' 패키지에 들어 있습니다. :-) 나는'objdump'도 작동 할 것이라고 상상하지만, 바이너리 파일에 rpath가 없다면 단순히 출력을 볼 수 없으므로 테스트 할 rpath-encumbered 바이너리를 찾지 않고 작동하는지 여부를 알기 어렵습니다. –

관련 문제