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

发布于 2024-11-30 02:42:15 字数 2178 浏览 0 评论 0原文

我尝试使用 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' 引起的,

但我不明白为什么。

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寒冷纷飞旳雪 2024-12-07 02:42:15

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

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

如果您研究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 property Libs.private that specifies these additional private or internal libraries that a static link would require.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文