使用 c++/cmake 链接静态库
我尝试使用 firebreath 框架链接程序中的库。
所以我在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)
为什么我添加 'include_directories' 是因为我在 .cpp 文件中包含头文件。
#include <giblib.h>
#include <Xlib.h>
执行make后,出现此错误信息。
/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' 引起的,
但我不明白为什么。
在我的程序中链接静态库应该怎么做?
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_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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为您误解了静态库的创建。静态库是目标文件的集合,它没有任何 init/deinit 代码来引入其他库,例如共享库或可执行文件。
如果您在构建使用 libraryA 的 applicationX 时创建了一个使用 libraryB 和 libraryC 代码的 libraryA 您必须手动拉入libraryB和libraryC。对于共享库,这是不必要的。
如果您研究
pkg-config
,您可以看到属性Libs.private
,它指定静态链接所需的这些附加私有或内部库。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 propertyLibs.private
that specifies these additional private or internal libraries that a static link would require.