如何在 CMake 项目中包含 wxWidgets 标头

问题描述 投票:0回答:2

我正在尝试使用 cmake 运行 wxWidget 示例,但无法在我的 C++ 项目(CMakeLists.txt)中包含 wxWidgets 的标头。如果我使用命令运行程序

g++ main.cpp `wx-config --cppflags --libs` -o wxTest

程序运行并显示窗口。但我该如何使用 CMakeLists.txt 文件来做到这一点。例如,通常我创建一个名为 external-libs 的单独文件夹,然后在其中创建一个名为 whateverlibraryname 的文件夹,然后在其中创建一个标头、src 和 lib 文件夹,我在其中放置头文件、任何源文件和 .分别是.so文件。但就 wxWidgets 而言,我有几个静态库文件,并且标头内有许多单独的文件夹,我不知道如何将它们全部包含在内。他们产生错误:

fatal error: wx/wx.h: No such file or directory
 #include <wx/wx.h>

我使用的是Ubuntu 18.04,我的项目目录结构如下:

├── build
└── source
    ├── CMakeLists.txt
    ├── external-libraries
    │   └── wxWidgets
    │       ├── headers
    │       │   ├── msvc
    │       │   │   └── wx
    │       │   └── wx
    │       │       ├── android
    │       │       ├── aui
    │       │       ├── dfb
    │       │       ├── generic
    │       │       ├── gtk
    │       │       ├── gtk1
    │       │       ├── html
    │       │       ├── meta
    │       │       ├── motif
    │       │       ├── msw
    │       │       ├── osx
    │       │       ├── persist
    │       │       ├── private
    │       │       ├── propgrid
    │       │       ├── protocol
    │       │       ├── qt
    │       │       ├── ribbon
    │       │       ├── richtext
    │       │       ├── stc
    │       │       ├── univ
    │       │       ├── unix
    │       │       ├── x11
    │       │       ├── xml
    │       │       └── xrc
    │       ├── lib   
                ├── libwx_baseu-3.1.a
    │       │   ├── libwx_baseu_net-3.1.a
    │       │   ├── libwx_baseu_xml-3.1.a
    │       │   ├── libwx_gtk3u_adv-3.1.a
    │       │   ├── libwx_gtk3u_aui-3.1.a
    │       │   ├── libwx_gtk3u_core-3.1.a
    │       │   ├── libwx_gtk3u_gl-3.1.a
    │       │   ├── libwx_gtk3u_html-3.1.a
    │       │   ├── libwx_gtk3u_propgrid-3.1.a
    │       │   ├── libwx_gtk3u_qa-3.1.a
    │       │   ├── libwx_gtk3u_ribbon-3.1.a
    │       │   ├── libwx_gtk3u_richtext-3.1.a
    │       │   ├── libwx_gtk3u_stc-3.1.a
    │       │   ├── libwx_gtk3u_xrc-3.1.a
    │       │   ├── libwxjpeg-3.1.a
    │       │   ├── libwxregexu-3.1.a
    │       │   ├── libwxscintilla-3.1.a
    │       │   └── libwxtiff-3.1.a
    │       └── src
    ├── main.cpp
    

Main.cpp 顶部有

#include<wx/wx.h>
。我正在使用 VSCode,当我使用 g++(上述命令)运行该程序时,它可以工作,但当我使用 CMake 运行相同的程序时,它不起作用。这就是如何包含头文件文件夹并使用包含所有 wxWidgets 头文件和库文件的 lib 文件夹。 CMakeLists.txt 文件的内容应该是什么,以及为了完成这项工作我必须做的其他必要的事情是什么。

c++ c++11 cmake wxwidgets
2个回答
5
投票

CMake 对 wxWidgets 有第一方支持,这是一个示例:

cmake_minimum_required(VERSION 3.20)
project(wxTest)

find_package(wxWidgets REQUIRED gl core base OPTIONAL_COMPONENTS net)
include(${wxWidgets_USE_FILE})

add_executable(wxTest main.cpp)
target_link_libraries(wxTest PRIVATE ${wxWidgets_LIBRARIES})

不幸的是这个模块有点过时了。如果使用导入的目标,上面的代码会更好,并且不需要与

include(${wxWidgets_USE_FILE})
进行这种奇怪的舞蹈,但可惜。至少有记录。

您可以设置各种变量来帮助它找到您的 wxWidgets 安装。有关更多详细信息,请参阅文档:https://cmake.org/cmake/help/latest/module/FindwxWidgets.html


0
投票

我发现之前的答案过于理论化且缺乏示例,就像 CMake 的大部分内容一样。

我的问题是在 Ubuntu 22.04 上将 WxWidgets 添加到现有的 CMake 系统。

问题 1 - CMake 确实转义了 `wx-config --cxxflags` 中的“`” 解决方案-运行 wx-config --libs 从命令行复制输出并用它替换`wx-config --cxxflags`。

就我的具体情况而言,不是你的情况,而是 -L/usr/local/lib -pthread -lwx_gtk3u-3.2

做同样的事情 `wx-config --cxxflags`

就我而言

-I/usr/local/lib/wx/include/gtk3-unicode-3.2 -I/usr/local/include/wx-3.2 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread

最终起作用的片段是这样的

set(WX_FLAGS "-I/usr/local/lib/wx/include/gtk3-unicode-3.2 -I/usr/local/include/wx-3.2 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread")
set(WX_LIB_FLAGS "-L/usr/local/lib -pthread -lwx_gtk3u-3.2")
list(APPEND CMAKE_CXX_FLAGS "${WX_FLAGS} -fPIC ${WX_LIB_FLAGS}")

由于硬编码选项在单台计算机上安装 WxWidgets 时是不变的,因此它们应该是稳定的,直到您修改 WxWidgets 的安装为止。

更便携的解决方案是执行 wx-config 并将结果捕获到变量中。

execute_process(COMMAND wx-config --cxxflags OUTPUT_VARIABLE WX_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND wx-config --libs OUTPUT_VARIABLE WX_LIB_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)

请务必去除尾随空格,否则在调用编译器的过程中将会出现一个

© www.soinside.com 2019 - 2024. All rights reserved.