Linux交叉编译Windows时,Catch2测试程序构建后执行失败
交叉编译Windows测试程序时阻止CMake自动执行测试
我有一个基于CMake v3.25.0构建的C++项目,采用Catch2 v3.7.0做单元测试。从Linux交叉编译到Windows时,CMake能正确识别交叉编译器并完成tests.exe的编译链接,但会尝试在Linux主机上运行Windows格式的测试可执行文件,导致构建失败,错误提示无法运行测试二进制文件。
解决方案
方法1:延迟测试发现到CTest阶段
修改CMakeLists.txt中catch_discover_tests的调用,添加DISCOVERY_MODE PRE_TEST参数,让CMake不在构建阶段执行测试,而是把测试发现的步骤推迟到手动执行ctest命令时:
catch_discover_tests(tests DISCOVERY_MODE PRE_TEST)
该参数要求CMake 3.10及以上版本,既能保留测试目标,又能避免构建阶段的执行错误。
方法2:交叉编译时禁用测试功能
如果交叉编译时只需要产出测试二进制文件,不需要处理测试相关逻辑,可以直接禁用CTest:
- 方案A:在
windows.cmake工具链文件中添加配置:set(BUILD_TESTING OFF CACHE BOOL "交叉编译时禁用测试") - 方案B:在CMake配置命令中传入参数:
cmake -DCMAKE_TOOLCHAIN_FILE=windows.cmake -DBUILD_TESTING=OFF --preset="$PRESET" -S .
此方法会跳过所有测试相关的目标生成与执行步骤,仅构建核心程序和测试二进制文件。
方法3:用Wine运行Windows测试程序(可选)
如果需要在构建阶段完成测试发现,可配置CMake使用Wine来运行Windows格式的测试可执行文件:
catch_discover_tests(tests COMMAND_WRAPPER wine)
前提是Linux主机已安装Wine,CMake会通过Wine执行tests.exe完成测试发现,不会抛出执行错误。
内容的提问来源于stack exchange,提问作者Donotalo
相关产品推荐
相关产品推荐

