2012-06-03 2 views
4

내에서 외부 라이브러리를 사용하여 나는 리눅스QT 창조주 - 나만의 도서관

내가 응용 프로그램 세트를 통해 몇 가지 일반적인 클래스를 사용할 수 있도록 내 자신의 라이브러리를 만든

에 C++로 QT 창조주의 응용 프로그램을 개발하고있다.

내가 만든 라이브러리에서 다른 외부 정적 라이브러리 (libSDL.a)를 사용했습니다. 정적 라이브러리 (* .a)로 라이브러리를 구성했는데 문제없이 컴파일됩니다.

그런 다음 내 라이브러리를 다른 응용 프로그램에 추가하고 일부 클래스를 사용했습니다. 내 응용 프로그램을 컴파일 할 때 다른 라이브러리에 대한 함수 호출에 대한 내 라이브러리 내에서 정의되지 않은 참조가 나타납니다.

제 생각에 정적 라이브러리는 컴파일하는 동안 복사되는 것으로 가정합니다. 내 라이브러리에 복사해야하는 라이브러리에 대한 정의되지 않은 참조가 나타나는 이유는 무엇입니까?

다음
QT -= gui 
TARGET = FoobarTools 
TEMPLATE = lib 
CONFIG += staticlib 
CONFIG -= shared 
DEFINES += FOOBARTOOLS_LIBRARY 
INCLUDEPATH += ./include/SDL_Headers/ 
LIBS += -L./bin/ -lSDL 
SOURCES += ... 
HEADERS += ... 

이 .PRO 파일 내 라이브러리를 사용하는 방법을 내 응용 프로그램 *입니다 :

QT -= gui 
TARGET = FoobarApp 
CONFIG += console 
CONFIG -= app_bundle 
TEMPLATE = app 
INCLUDEPATH += ./include/ 
LIBS += -L./bin/ -lFoobarTools 
SOURCES += ... 
HEADERS += ... 

답변

-1

을 나는 당신을 생각 여기

라이브러리 프로젝트는 * .PRO 파일에 구성 방법입니다 여기에 답변을 찾을 수 있습니다, 더 정확하게를

http://gcc.gnu.org/ml/gcc-help/2004-04/msg00104.html

을하고 난

http://gcc.gnu.org/ml/gcc-help/2004-04/msg00106.html

내가 지금 그것을 테스트 할 수 없습니다,하지만 난 가능한 원인이 재개 될 수 있다고 생각 : N이-후속

이 이

"멀리 도서관을 던져"합니다 링커가 "온다 경우 그 (것)들의 맞은 편에 그것이 정의하는 상징의 아무도는 필요로하지 않는다 "

응급 처치 도움으로, 당신의 두번째 .pro 파일에 -lSDL를 추가하십시오.

편집 : 정적 라이브러리 (첫 번째 .pro 파일)가 실제로 libSDL의 일부 기호를 사용하고 있습니까? 그렇지 않으면 컴파일러는 libSDL.a 파일을 무시하고 정적 라이브러리에 포함시키지 않습니다. libSDL.a의 일부 심볼을 ​​사용하더라도 다른 심볼은 그렇지 않을 것입니다 (적어도 이것은 내가 생각하는 것입니다). "정적 라이브러리는 링크 할 때 특별한 규칙이 있습니다. 정적 라이브러리의 객체는 객체가 해결되지 않은 심볼을 제공하는 경우에만 바이너리에 추가됩니다." (참조 : https://stackoverflow.com/a/2649792/1284631). 그런 다음 실행 파일 (두 번째 .pro 파일)이 libSDL의 일부 복사되지 않은 기호를 사용하면 오류가 발생합니다. 동일한 소스를 인용하면 : "Linux에서는 --whole-archive 링커 옵션을 사용하여 그 동작을 변경할 수 있습니다 : g ++ -Wl, - whole-archive some_static_lib.a -Wl, - no-whole-archive". 이렇게하면 전체 정적 libSDL.a 아카이브를 자신의 것으로 가져갈 수 있습니다. 에서

1

응용 프로그램의 당신이 필요로 .PRO :

INCLUDEPATH += LibraryPath (이 헤더 파일의 디렉토리를 가리 킵니다.)

DEPENDPATH += LibraryPath (이것은 또한 헤더 파일의 디렉토리를 가리 킵니다.)

LIBS += -LDebugOrReleasePath -lLibraryName (이것은 끝의 시작과 '.A'에서 'LIB'lib 디렉토리 - 파일 이름을 뺀 값입니다.) 사용자 정의 라이브러리에 #include를 여전히 작업하는 경우 그 일단

체크를 수행합니다.

정적 libary의 .pro 파일에서 아무 것도 건드릴 필요가 없으므로 'CONFIG + release'를 추가하십시오.

0

라이브러리와 사용중인 라이브러리가 모두 응용 프로그램에 연결되어 있어야합니다.

INCLUDEPATH += ./include/SDL_Headers/ 
INCLUDEPATH += ./include/ 
LIBS += -L./bin/ -lFoobarTools 
LIBS += -L./bin/ -lSDL 
//And dont forget the Target dependencies. 
PRE_TARGETDEPS += ./libFoobarTools.a 
PRE_TARGETDEPS ./libSDL.a 

라이브러리의 컴파일하지만 응용 프로그램이 this question을 확인하는 이유에 대한 자세한 내용을 찾으려면

.