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

未修改PATH时CMake无法识别MinGW编译器,多目标编译求助

解决CMake外部项目指定非环境变量路径编译器的问题

问题描述

我的项目包含两个目标:一个是针对嵌入式设备的交叉编译程序,另一个是测试程序,二者需要使用不同编译器。主项目通过toolchain.cmake文件指定ARM编译器路径,运行正常。但我希望在不将mingw64/bin添加到环境变量的情况下构建测试程序(添加后可正常运行)。

测试项目通过以下方式添加:

ExternalProject_Add(${UNIT_TEST_TARGET}
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test/
    PREFIX ${UNIT_TEST_TARGET}
    CMAKE_ARGS ${GTEST_ARGS}
    BUILD_ALWAYS TRUE
    INSTALL_COMMAND cmake -E echo "Skipping install step."
    EXCLUDE_FROM_ALL TRUE)

我尝试通过以下代码将toolchaintests.cmake文件传递给该外部项目:

list(APPEND GTEST_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/toolchaintests.cmake")

其中toolchaintests.cmake内容如下:

set(CMAKE_C_COMPILER  <my_path_here>/mingw64/bin/gcc.exe)
set(CMAKE_CXX_COMPILER <my_path_here>/mingw64/bin/g++.exe)

但此时CMake无法识别编译器,报错信息如下:

-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Check for working C compiler:  <my_path_here>/mingw64/bin/gcc.exe
-- Check for working C compiler:  <my_path_here>/mingw64/bin/gcc.exe - broken
CMake Error at C:/Program Files/CMake/share/cmake-3.24/Modules/CMakeTestCCompiler.cmake:69 (message):
  The C compiler

    " <my_path_here>/mingw64/bin/gcc.exe"

提示无法编译简单测试程序,具体输出为:

Change Dir:  <my_path_here>/out/build/tests/src/tests-build/CMakeFiles/CMakeTmp

    Run Build Command(s):C:/Ninja/ninja-win/ninja.exe cmTC_a1c48 && [1/2] Building C object CMakeFiles\cmTC_a1c48.dir\testCCompiler.c.obj
    FAILED: CMakeFiles/cmTC_a1c48.dir/testCCompiler.c.obj
      <my_path_here>\mingw64\bin\gcc.exe    -o CMakeFiles\cmTC_a1c48.dir\testCCompiler.c.obj -c  <my_path_here>\out\build\tests\src\tests-build\CMakeFiles\CMakeTmp\testCCompiler.c
    ninja: build stopped: subcommand failed.

解决方法

1. 修复路径的空格问题

从报错信息能看到编译器路径前多了个空格,这是核心问题之一:

  • 修正toolchaintests.cmake的路径写法,用引号包裹避免空格解析错误:
    set(CMAKE_C_COMPILER "<my_path_here>/mingw64/bin/gcc.exe")
    set(CMAKE_CXX_COMPILER "<my_path_here>/mingw64/bin/g++.exe")
    
  • 传递工具链文件参数时,改用CMAKE_CURRENT_LIST_DIR确保路径拼接准确:
    list(APPEND GTEST_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_LIST_DIR}/cmake/toolchaintests.cmake")
    

2. 直接在外部项目参数中指定编译器

跳过工具链文件,直接把编译器路径作为参数传给外部项目,避免额外文件的解析问题:

list(APPEND GTEST_ARGS
  "-DCMAKE_C_COMPILER=<my_path_here>/mingw64/bin/gcc.exe"
  "-DCMAKE_CXX_COMPILER=<my_path_here>/mingw64/bin/g++.exe"
)

3. 为外部项目临时设置环境变量

MinGW编译器依赖同目录下的DLL文件,即使指定了编译器路径,系统找不到依赖也会失败。可以为外部项目临时添加环境变量:

ExternalProject_Add(${UNIT_TEST_TARGET}
  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test/
  PREFIX ${UNIT_TEST_TARGET}
  CMAKE_ARGS ${GTEST_ARGS}
  BUILD_ALWAYS TRUE
  INSTALL_COMMAND cmake -E echo "Skipping install step."
  EXCLUDE_FROM_ALL TRUE
  # 临时添加MinGW路径到环境变量,不影响全局
  ENV "PATH=<my_path_here>/mingw64/bin;$ENV{PATH}"
)

4. 验证编译器本身可用性

先手动在命令行执行:

<my_path_here>/mingw64/bin/gcc.exe --version

确认编译器能正常启动,没有缺失依赖或权限问题,若手动执行失败,需先修复MinGW安装。

内容的提问来源于stack exchange,提问作者Rojo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:35:36