2011-08-17 236 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代码来引入额外的库,如共享库或可执行文件。

如果创建LibraryA的使用代码libraryBlibraryC当你建立applicationX使用LibraryA的您必须手动拉两个libraryBlibraryC。借助共享库,这不是必需的。

如果调查pkg-config你可以看到属性Libs.private,指定静态链接将需要这些额外私人或内部库。