2011-08-17 3 views
0

firebreath 프레임 워크를 사용하여 내 프로그램에서 라이브러리를 연결하려고합니다.C++/cmake로 정적 라이브러리 링크하기

그래서이 코드를 projectDef.cmake에 추가합니다.

include_directories(/usr/include/giblib) 
include_directories(/usr/include/X11) 

add_library(giblib_ptm STATIC IMPORTED) 
set_property(TARGET giblib_ptm PROPERTY IMPORTED_LOCATION /usr/lib/libgiblib.a) 

add_library(X11_ptm STATIC IMPORTED) 
set_property(TARGET X11_ptm PROPERTY IMPORTED_LOCATION /usr/lib/i386-linux-gnu/libX11.a) 

add_library(Imlib_ptm STATIC IMPORTED) 
set_property(TARGET Imlib_ptm PROPERTY IMPORTED_LOCATION /usr/lib/libImlib2.a) 

target_link_libraries(Printmade2 giblib_ptm X11_ptm Imlib_ptm) 

왜 내 .cpp 파일에 'include_directories의' 내가 헤더가 포함되어 파일을 추가합니다.

#include <giblib.h> 
#include <Xlib.h> 

하게 실행이 오류 메시지가 나타납니다.

/usr/lib/i386-linux-gnu/libX11.a(OpenDis.o): In function `OutOfMemory': 
(.text+0x459): undefined reference to `xcb_disconnect' 
/usr/lib/i386-linux-gnu/libX11.a(OpenDis.o): In function `XOpenDisplay': 
(.text+0x8f5): undefined reference to `xcb_get_setup' 
/usr/lib/i386-linux-gnu/libX11.a(OpenDis.o): In function `XOpenDisplay': 
(.text+0xedb): undefined reference to `xcb_get_maximum_request_length' 
/usr/lib/i386-linux-gnu/libX11.a(xcb_disp.o): In function `_XConnectXCB': 
(.text+0x176): undefined reference to `xcb_parse_display' 
/usr/lib/i386-linux-gnu/libX11.a(xcb_disp.o): In function `_XConnectXCB': 
(.text+0x1d7): undefined reference to `xcb_connect_to_display_with_auth_info' 
... 
/usr/lib/i386-linux-gnu/libX11.a(xcb_io.o): In function `poll_for_event': 
(.text+0x30e): undefined reference to `xcb_poll_for_event' 
/usr/lib/i386-linux-gnu/libX11.a(xcb_io.o): In function `poll_for_response': 
(.text+0x6b4): undefined reference to `xcb_poll_for_reply' 
/usr/lib/i386-linux-gnu/libX11.a(xcb_io.o): In function `_XSend': 
(.text+0x85f): undefined reference to `xcb_writev' 
/usr/lib/i386-linux-gnu/libX11.a(xcb_io.o): In function `_XReadEvents': 
(.text+0xa1f): undefined reference to `xcb_connection_has_error' 
.... 

나는이 오류가 'add_library''set_property',

에 의해 원인을 생각하지만 난 이유를 이해할 수 없다.

내 프로그램에서 정적 라이브러리를 연결하려면 어떻게해야합니까?

답변

2

나는 정적 라이브러리의 생성을 오해하고 있다고 생각합니다. 정적 라이브러리는 객체 파일의 모음입니다. 공유 라이브러리 나 실행 파일과 같은 추가 라이브러리를 가져올 init/deinit 코드가 없습니다.

당신은 당신이 수동으로 모두 libraryBlibraryC에 끌어합니다 libraryA를 사용 applicationX를 빌드 할 때 libraryBlibraryC에서 코드를 사용하는 libraryA을 작성하는 경우. 공유 라이브러리를 사용하면 이것이 필요하지 않습니다.

당신이 pkg-config을 조사하는 경우는 재산 정적 링크가 필요 이러한 추가 개인 또는 내부 라이브러리를 지정 Libs.private을 볼 수 있습니다.