未修改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
相关产品推荐
相关产品推荐

