如何在 CMake 项目中包含 wxWidgets headers

How to include wxWidgets headers in CMake project

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

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

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

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

我使用的是Ubuntu18.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 的相同程序时它不起作用。这就是如何包含 header 文件夹并使用包含所有 wxWidgets header 和库文件的 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