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

问题描述

我正在尝试使用 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 文件内容应该是什么,以及我必须做的其他必要的事情是什么。

解决方法

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(wxTestmain.cpp)
target_link_libraries(wxTest PRIVATE ${wxWidgets_LIBRARIES})

这个模块的遗留问题有点不幸。上面的代码使用导入的目标会好得多,而且不需要用 include(${wxWidgets_USE_FILE}) 做这种奇怪的舞蹈,但是唉。至少它被记录在案。

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