You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:49:51