我正在尝试使用 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(wxTest main.cpp)
target_link_libraries(wxTest PRIVATE ${wxWidgets_LIBRARIES})
不幸的是这个模块有点过时了。如果使用导入的目标,上面的代码会更好,并且不需要与
include(${wxWidgets_USE_FILE})
进行这种奇怪的舞蹈,但可惜。至少有记录。
您可以设置各种变量来帮助它找到您的 wxWidgets 安装。有关更多详细信息,请参阅文档:https://cmake.org/cmake/help/latest/module/FindwxWidgets.html
我发现之前的答案过于理论化且缺乏示例,就像 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)
请务必去除尾随空格,否则在调用编译器的过程中将会出现一个