SuperMan-Lfj / blog

Apache License 2.0
1 stars 0 forks source link

wxWidgets 的Cmake编译,以及 minimal 的运行 #68

Open SuperMan-Lfj opened 1 year ago

SuperMan-Lfj commented 1 year ago

wxWidgets 是一个开源的跨平台UI框架,支持Windows/Mac/Linux的编译和运行。

编译

wxWidgets 支持 configure方式的编译和Cmake方式的编译。

clone完源码之后,需要把submodule 更新一下:git submodule update --remote --init

configure 编译

configure 编译出来缺少cmake的相关配置。如果你要使用Cmake去集成库的话,不建议使用这种方式编译,而是去使用Cmake编译。

运行如下命令,可以查看支持的配置:

./configure --help

最简单的编译命令如下:

# 编译静态库
./configure --prefix=/Users/xxx/wxWidgets/build --disable-shared

编译后的产物结构如下:

.
├── bin
│   ├── wx-config -> /Users/superman/Code/wxWidgets/build/lib/wx/config/osx_cocoa-unicode-static-3.2
│   ├── wxrc -> wxrc-3.2
│   └── wxrc-3.2
├── include
│   └── wx-3.2
├── lib
│   ├── libwx_baseu-3.2.a
│   ├── libwx_baseu_net-3.2.a
│   ├── libwx_baseu_xml-3.2.a
│   ├── libwx_osx_cocoau_adv-3.2.a
│   ├── libwx_osx_cocoau_aui-3.2.a
│   ├── libwx_osx_cocoau_core-3.2.a
│   ├── libwx_osx_cocoau_gl-3.2.a
│   ├── libwx_osx_cocoau_html-3.2.a
│   ├── libwx_osx_cocoau_media-3.2.a
│   ├── libwx_osx_cocoau_propgrid-3.2.a
│   ├── libwx_osx_cocoau_qa-3.2.a
│   ├── libwx_osx_cocoau_ribbon-3.2.a
│   ├── libwx_osx_cocoau_richtext-3.2.a
│   ├── libwx_osx_cocoau_stc-3.2.a
│   ├── libwx_osx_cocoau_webview-3.2.a
│   ├── libwx_osx_cocoau_xrc-3.2.a
│   ├── libwxscintilla-3.2.a
│   └── wx
└── share
    ├── aclocal
    ├── bakefile
    └── locale

Cmake 编译

安装cmake之后,命令行运行:

cmake /wxWidgets/source/path \
  -DCMAKE_INSTALL_PREFIX=~/wx_install_dir \
  -DwxBUILD_SHARED=OFF
cmake --build . --target install

编译结果如下:

.
├── bin
│   ├── wx-config -> /Users/superman/wx_install/lib/wx/config/osx_cocoa-unicode-static-3.2
│   ├── wxrc -> /Users/superman/wx_install/bin/wxrc-3.2
│   └── wxrc-3.2
├── include
│   └── wx-3.2
└── lib
    **├── cmake**  <----- 这里有cmake相关的配置,这个在cmake链接时,非常重要。configure是没有这个的。
    ├── libwx_baseu-3.2.a
    ├── libwx_baseu_net-3.2.a
    ├── libwx_baseu_xml-3.2.a
    ├── libwx_osx_cocoau_adv-3.2.a
    ├── libwx_osx_cocoau_aui-3.2.a
    ├── libwx_osx_cocoau_core-3.2.a
    ├── libwx_osx_cocoau_gl-3.2.a
    ├── libwx_osx_cocoau_html-3.2.a
    ├── libwx_osx_cocoau_media-3.2.a
    ├── libwx_osx_cocoau_propgrid-3.2.a
    ├── libwx_osx_cocoau_qa-3.2.a
    ├── libwx_osx_cocoau_ribbon-3.2.a
    ├── libwx_osx_cocoau_richtext-3.2.a
    ├── libwx_osx_cocoau_stc-3.2.a
    ├── libwx_osx_cocoau_webview-3.2.a
    ├── libwx_osx_cocoau_xrc-3.2.a
    ├── libwxjpeg-3.2.a
    ├── libwxpng-3.2.a
    ├── libwxregexu-3.2.a
    ├── libwxscintilla-3.2.a
    ├── libwxtiff-3.2.a
    └── wx

至此,wxWidgets的编译就搞定了。至于参数的配置,可以根据自己的业务需求去动态修改。

minimal app的编译运行

minimal app 是wxWidgets中的一个最小的sample,路径位于:wxWidgets-3.2.2.1/samples/minimal。 使用Clion打开这个文件夹,选择cmake工程,打开之后,如果直接编译,会遇到以下错误:

-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:35 (find_package):
  Could not find a package configuration file provided by "wxWidgets"
  (requested version 3.2) with any of the following names:

    wxWidgetsConfig.cmake
    wxwidgets-config.cmake

  Add the installation prefix of "wxWidgets" to CMAKE_PREFIX_PATH or set
  "wxWidgets_DIR" to a directory containing one of the above files.  If
  "wxWidgets" provides a separate development package or SDK, be sure it has
  been installed.

这是因为没有找到wxWidgets组件。所以需要配置一下。按照提示有两种方式可以做到:

  1. 添加CMAKE_PREFIX_PATH值。
  2. 设置wxWidgets_DIR值。

如果在Google搜索这个错误,可能会搜到这个。但是这个文章并没有找到根本原因,另外操作也比较麻烦,个人认为不是最佳方案。

设置的值有个要求,就是都必须包含 wxWidgetsConfig.cmake 或者 wxwidgets-config.cmake 文件之一。 上面我们使用configure 编译出来的库是不包含上面的文件的,cmake的则是包含的,路径如下:wx_install_dir/lib/cmake/wxWidgets

打开cmakelists.txt文件,添加的位置如下:


。。。。
# Name the project
project(minimal)

#下面两个选择一个即可:
set(CMAKE_PREFIX_PATH /Users/superman/wx_install/lib/cmake/wxWidgets)
#或者这个:
set(wxWidgets_DIR /Users/superman/wx_install/lib/cmake/wxWidgets)

# Request the required wxWidgets libs
find_package(wxWidgets 3.2 COMPONENTS core base REQUIRED CONFIG)

。。。。。。

编译运行,即可看到最简单的UI画面。


参考文章:

  1. https://docs.wxwidgets.org/3.2.2/overview_cmake.html
  2. https://forums.wxwidgets.org/viewtopic.php?f=19&t=45198
  3. https://www.justdevtutorials.com/post/wxwidgets-cmake/