开发者

Linking static libraries with c++/cmake

开发者 https://www.devze.com 2023-03-29 02:31 出处:网络
I try to link libraries in my program using firebreath framework. So I add this code in projectDef.cmake.

I try to link libraries in my program using firebreath framework.

So I add this code in 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)

Why I add 'include_directories' is I include header file in my .cpp file.

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

After execute make, this error message appears.

/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开发者_Go百科_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'
....

I think this error is cause by 'add_library' and 'set_property',

but I can't understand why.

What should I do for linking static libraries in my program?


I think you are misunderstanding the creation of a static library. A static library is a collection of object files, it does not have any init/deinit code to pull in additional libraries like a shared library or an executable can.

If you create a libraryA that uses code from libraryB and libraryC when you build applicationX that uses libraryA you must manually pull in both libraryB and libraryC. With shared libraries this is not necessary.

If you investigate pkg-config you can see the property Libs.private that specifies these additional private or internal libraries that a static link would require.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号