我正在使用 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_resources
的args
参数。但是,如果任何包含路径包含空格,则其缺点是不起作用。这是一个小例子:
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"并使用剩余的字符串作为args
compile_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)