如何为多子目录结构的C++项目配置Meson构建系统?
按你给出的多目录C++项目结构,直接按以下分层规则编写meson.build即可,Meson原生支持递归子目录构建,不需要额外引入复杂脚本。
分层Meson构建配置方案
根目录 Project/meson.build
该文件负责全局项目声明、第三方依赖查找、全局编译参数配置、子模块引入、最终可执行文件生成,参考配置如下:
project('替换为你的项目名', 'cpp', default_options : [ 'cpp_std=c++17', # wxWidgets、MongoDB C++驱动最低兼容C++17,可按实际需求调整版本 'warning_level=2', 'werror=false' ] ) # 查找全局第三方依赖 wx_dep = dependency('wxWidgets', version : '>=3.2', modules : ['core', 'base', 'gui', 'net'] # 按实际用到的wxWidgets模块增删 ) mongo_dep = dependency('libmongocxx', version : '>=3.7') bson_dep = dependency('libbsoncxx', version : '>=3.7') mongo_deps = [mongo_dep, bson_dep] # 配置全局头文件搜索路径,所有子目录可直接通过 #include <A/A1.hpp> 形式引用头文件 inc_root = include_directories('Source') # 引入业务子目录 # 如果你希望Source目录做统一入口,可在Source下新增meson.build,在里面写三个subdir引入A/B/C,此处改为subdir('Source')即可 subdir('Source/A') subdir('Source/B') subdir('Source/C') # 链接所有模块生成最终可执行文件 executable('替换为你的可执行文件名', # 填写main函数所在源码路径,比如放在Source根目录就写'Source/main.cpp' 'Source/main.cpp', dependencies : [wx_dep, mongo_deps, libA_dep, libB_dep, libC_dep], include_directories : inc_root, install : true )
子目录meson.build配置
Source/A、Source/B、Source/C三个子目录的配置逻辑完全一致,都是收集当前目录源码、编译为静态库、对外暴露头文件和依赖供上层调用。以Source/A/meson.build为例:
# 列出当前目录下所有参与编译的cpp文件 srcs_a = files( 'A1.cpp', 'A2.cpp' # 继续追加当前目录下其他源码文件 ) # 编译当前模块为静态库 libA = static_library('A', srcs_a, include_directories : inc_root, dependencies : [wx_dep, mongo_deps], # 当前模块实际用到的依赖加在这里,没用到可省略 install : false # 内部模块不需要单独安装 ) # 对外暴露当前模块的依赖规则,上层调用时自动传递头文件路径、链接选项 libA_dep = declare_dependency( link_with : libA, include_directories : include_directories('.'), dependencies : [wx_dep, mongo_deps] )
Source/B、Source/C下的配置仅需替换对应变量名(比如libA替换为libB/libC、srcs_a替换为对应源码列表变量)、源码列表(替换为B1.cpp/B2.cpp、C1.cpp/C2.cpp)即可。
构建操作说明
- 目录中的BuildDir不需要手动创建,也不要存放任何源码文件,Meson执行构建配置时会自动生成该目录并存放所有构建产物
- 首次配置构建环境,在Project根目录执行命令:
meson setup BuildDir,执行成功即代表依赖检测、构建规则生成完成 - 后续增量编译直接执行:
meson compile -C BuildDir即可
常见问题处理
- 如果提示找不到wxWidgets依赖:Linux环境先确认安装了对应发行版的wxWidgets 3.2+开发包;Windows环境用vcpkg安装wxWidgets后,执行setup命令时追加
--vcpkg-root=你的vcpkg本地安装路径参数即可 - 如果提示找不到MongoDB相关依赖:先确认已经安装了mongo-c-driver和mongo-cxx-driver的开发版本,若驱动安装在自定义路径,提前把驱动对应的pkgconfig目录路径加到
PKG_CONFIG_PATH环境变量再执行setup命令 - 如果子模块之间存在调用关系(比如B模块需要调用A模块的代码),直接在被依赖模块的meson.build里,把对应模块的
*_dep对象加到dependencies列表即可,不需要额外配置头文件路径或链接规则 - 头文件不需要手动加入源码列表,Meson会自动跟踪头文件变动触发增量编译
内容的提问来源于stack exchange,提问作者Byte
相关产品推荐
相关产品推荐

