meson-build:wxWidgets 资源文件,用于 Windows 未构建

meson-build: wxWidgets Resource file for Windows not building

本文关键字:用于 Windows 构建 源文件 wxWidgets 资源 meson-build      更新时间:2023-10-16

我正在使用 wxWidgets 为 UI 开发一个应用程序。该项目可以针对Windows和Linux,我正在使用meson/ninja来构建。

一般构建适用于这两个平台,只要我不在 Windows 上使用资源 (.rc( 文件。

当我添加 .rc 文件时,它无法编译。我在Windows上使用MSYS2/mingw_w64作为工具链。

出于测试目的,我创建了一个用于测试和重现的小示例。

此示例涉及以下文件:

  • cpp文件,带有一些wxWidgets"Hello World"测试代码。
  • .rc-file,定义 Windows 的主题和应用程序图标。
  • meson.build-file, 配置 for meson
  • 一些图标文件

我在Windows中的MSYS2-MINGW64 CLI中运行以下命令:

meson build_win && cd build_win && ninja

生成了一些文件/文件夹,但生成过程失败。从终端输出:

The Meson build system
Version: 0.53.0
Source dir: //192.168.122.1/VMShare_1/Tests/meson-test
Build dir: //192.168.122.1/VMShare_1/Tests/meson-test/build_win
Build type: native build
Project name: TestWXApp
Project version: undefined
C compiler for the host machine: cc (gcc 9.2.0 "cc (Rev2, Built by MSYS2 project) 9.2.0")
C linker for the host machine: cc GNU ld.bfd 2.33.1
Host machine cpu family: x86_64
Host machine cpu: x86_64
C++ compiler for the host machine: c++ (gcc 9.2.0 "c++ (Rev2, Built by MSYS2 project) 9.2.0")
C++ linker for the host machine: c++ GNU ld.bfd 2.33.1
wx-config found: YES (sh C:msys64mingw64bin/wx-config) 3.0.4
Run-time dependency WxWidgets found: YES 3.0.4
Windows resource compiler: GNU windres (GNU Binutils) 2.33.1
Build targets in project: 2
Found ninja.EXE-1.9.0 at C:msys64mingw64bin/ninja.EXE
[1/3] Generating Windows resource for file '._resources_theme_win32.rc' with a custom command.
FAILED: ._resources_theme_win32.rc_theme_win32.o
"C:/msys64/mingw64/bin/windres.EXE" ".././resources/theme_win32.rc" "._resources_theme_win32.rc_theme_win32.o" "--preprocessor-arg=-MD" "--preprocessor-arg=-MQ._resources_theme_win32.rc_theme_win32.o" "--preprocessor-arg=-MF._resources_theme_win32.rc_theme_win32.o.d"
.././resources/theme_win32.rc:2:10: fatal error: wx/msw/wx.rc: No such file or directory
2 | #include "wx/msw/wx.rc"
|          ^~~~~~~~~~~~~~
compilation terminated.
C:/msys64/mingw64/bin/windres.EXE: preprocessing failed.
[2/3] Compiling C++ object TestWXApp@exe/src_wxExample.cpp.obj.
ninja: build stopped: subcommand failed.

看起来我需要为资源编译器添加依赖项 wxWidgets,但我不知道如何。

介子构建:

project('TestWXApp', 'c')
add_languages('cpp', required : true)
src_data = []
if build_machine.system() == 'windows'
#compile static wxWidgets on windows
wxDep = dependency('wxwidgets',
version : '>=3.0.0',
required : true,
modules : ['--static', 'std', 'stc'])
mod_rescomp = import('windows')
src_data += mod_rescomp.compile_resources('./resources/theme_win32.rc')
else
#build for linux
wxDep = dependency('wxwidgets',
version : '>=3.0.0',
required : true,
modules : ['std', 'stc'])
endif
src_data += ['./src/wxExample.cpp']
inc_tool = include_directories('./src')
inc_res = include_directories('./resources')
executable('TestWXApp',
sources : [src_data],
include_directories : [inc_res],
dependencies : wxDep)

我在这里放了一个包含整个项目(+生成的build_win文件夹(的压缩包:https://lots-of.space/s/NLqmJzjcrknKqbX

如果需要更多信息,请告诉我。我希望有人能指出我正确的方向。

问候

XXXBold。

更新, 26.01.2020

我现在能够构建项目,但是,现在它需要硬编码路径。我通过在终端中运行 wx-config 并手动复制输出找到了这些路径:

wx-config --cppflags --static

介子上的资源编译器的文档可以在这里找到:https://mesonbuild.com/Windows-module.html#page-description

New meson.build-file:

project('TestWXApp', 'c')
add_languages('cpp', required : true)
src_data = []
if build_machine.system() == 'windows'
#compile static wxWidgets on windows
wxDep = dependency('wxwidgets',
version : '>=3.0.0',
required : true,
modules : ['--static', 'std', 'stc'])
mod_rescomp = import('windows')
src_data += mod_rescomp.compile_resources('./resources/theme_win32.rc',
args : ['-IC:/msys64/mingw64/lib/wx/include/msw-unicode-static-3.0',
'-IC:/msys64/mingw64/include/wx-3.0',
'-D_FILE_OFFSET_BITS=64',
'-D__WXMSW__'])
else
#build for linux
wxDep = dependency('wxwidgets',
version : '>=3.0.0',
required : true,
modules : ['std', 'stc'])
endif
src_data += ['./src/wxExample.cpp']
inc_tool = include_directories('./src')
inc_res = include_directories('./resources')
executable('TestWXApp',
sources : [src_data],
include_directories : [inc_res],
dependencies : wxDep)

我相信有更好的方法可以做到这一点...

我不知道 Meson,但您需要为资源编译器 (rc.exe( 提供 wxWidgets 包含目录的路径,而不仅仅是C++编译器本身。

我在更新 26.01.2020 之后遇到了与您相同的问题。

我发布了一个相关问题:如何从介子构建系统中的依赖项中获取包含目录

一种解决方法是从wxDep中获取cppflags变量并将其拆分为数组并将其传递给compile_resourcesargs参数。但是,如果任何包含路径包含空格,则其缺点是不起作用。这是一个小例子:

project('project1', ['cpp'])
windows = import('windows')
src = ['main.cpp']
wxDep = dependency('wxwidgets')
wx_cppflags = wxDep.get_configtool_variable('cppflags')
wx_cppflags_arr = wx_cppflags.split(' ')
src += windows.compile_resources('test.rc', args: wx_cppflags_arr)
executable('testapp',
sources : src,
dependencies : wxDep)

这就是我的做法(感谢@dcbaker,github.com/mesonbuild/meson#6897(。

事实上,wx-config有办法为我们提供所有必要的参数(此示例来自我的 MSYS2 安装(:

$ wx-config --rescomp
windres --include-dir C:/msys64/mingw64/include/wx-3.0 --define __WIN32__ --define __GNUWIN32__ --define WX_CPU_AMD64

我们可以运行该命令,删除前面的"windres"并使用剩余的字符串作为argscompile_resources

"这里有一件丑陋的事情,介子阵列没有很好的切片方法,所以我做了一个小技巧,从args列表中删除了windres">

wx_dep = dependency('wxwidgets')
raw_wx_windres_args = wx_dep.get_variable(configtool : 'rescomp').split()
wx_windres_args = []
foreach a : raw_wx_windres_args
if a != 'windres'
wx_windres_args += a
endif
endforeach
win = import('windows')
rc_file = win.compile_resources('resources/windows.rc', args : wx_windres_args)