使用 c++/cmake 链接静态库

Posted

技术标签:

【中文标题】使用 c++/cmake 链接静态库【英文标题】:Linking static libraries with c++/cmake 【发布时间】:2011-08-17 01:53:56 【问题描述】:

我尝试使用 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>

执行ma​​ke后,出现此错误信息。

/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'引起的,

但我不明白为什么。

在我的程序中链接静态库应该怎么做?

【问题讨论】:

【参考方案1】:

我认为您误解了静态库的创建。静态库是目标文件的集合,它没有任何 init/deinit 代码来拉入其他库,例如共享库或可执行文件。

如果您在构建 applicationX 时使用 libraryBlibraryC 中的代码创建一个 libraryA,该 applicationX 使用 libraryA 您必须手动拉入 libraryBlibraryC。对于共享库,这不是必需的。

如果您调查pkg-config,您会看到属性Libs.private,它指定了静态链接所需的这些额外私有或内部库。

【讨论】:

以上是关于使用 c++/cmake 链接静态库的主要内容,如果未能解决你的问题,请参考以下文章

CMake和静态库顺序

如何使用cmake生成基于静态库的动态链接库

CMake:将Fortran与静态C库链接失败

opencv静态链接库cmake链接顺序问题

cmake 强制链接静态库

当我链接动态库而不是静态库时,CMake 有效