无法使用 CMake 指定编译器

Posted

技术标签:

【中文标题】无法使用 CMake 指定编译器【英文标题】:Unable to specify the compiler with CMake 【发布时间】:2012-10-14 19:15:08 【问题描述】:

我对这个CMakeLists.txt 文件有疑问:

cmake_minimum_required(VERSION 2.6)

SET(CMAKE_C_COMPILER C:/MinGW/bin/gcc)
SET(CMAKE_CXX_COMPILER C:/MinGW/bin/g++)

project(cmake_test)

add_executable(a.exe test.cpp)

使用:cmake -G "MinGW Makefiles" 调用 cmake,失败并显示以下输出:

c:\Users\pietro.mele\projects\tests\buildSystem_test\cmake_test>cmake -G "MinGW Makefiles" .
-- The C compiler identification is GNU 4.6.1
-- The CXX compiler identification is GNU 4.6.1
-- Check for working C compiler: C:/MinGW/bin/gcc
CMake Error: your C compiler: "C:/MinGW/bin/gcc" was not found.   Please set CMAKE_C_COMPILER to a valid compiler path or name.
CMake Error: Internal CMake error, TryCompile configure of cmake failed
-- Check for working C compiler: C:/MinGW/bin/gcc -- broken
CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
  The C compiler "C:/MinGW/bin/gcc" is not able to compile a simple test
  program.

CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
CMakeLists.txt:10 (project)

CMake Error: your C compiler: "C:/MinGW/bin/gcc" was not found.   Please set CMAKE_C_COMPILER to a valid compiler path or name.
CMake Error: your CXX compiler: "C:/MinGW/bin/g++" was not found.   Please set CMAKE_CXX_COMPILER to a valid compiler path or name.
-- Configuring incomplete, errors occurred!

但是gcc 编译器在C:/MinGW/bin/ 中并且可以工作。

有什么想法吗?

平台:

Windows 7 MinGW/GCC 4.6

【问题讨论】:

我好久没接触Windows了,但是操作系统通常说C:\MinGW\bin\g++而不是你指定的,这是否困扰cmake? I thought the same 不,它不会打扰 CMake。无论操作系统如何,CMake 都使用“/”作为分隔符。在 Windows 上,我们会在必要时翻译为“\”。 顺便说一句,因为这里的错误信息是“找不到”——也许你需要在文件名的末尾添加“.exe”? 【参考方案1】:

切勿尝试在CMakeLists.txt 文件中设置编译器。

有关如何使用不同的编译器,请参阅 CMake 常见问题解答:

https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-do-i-use-a-different-compiler

(请注意,您正在尝试方法 #3,并且常见问题解答中显示“(避免)”...)

我们建议避免使用“in the CMakeLists”技术,因为在第一次配置时使用不同的编译器会出现问题,然后 CMakeLists 文件会更改以尝试设置不同的编译器...根据运行 CMake 的开发人员的偏好,CMakeLists 文件应与多个编译器一起使用。

最好的方法是在构建树中第一次调用 CMake 之前设置环境变量 CCCXX

CMake 检测到要使用的编译器后,会将它们保存在 CMakeCache.txt 文件中,这样即使这些变量从环境中消失,它仍然可以生成正确的构建系统...

如果您需要更改编译器,则需要从新的构建树开始。

【讨论】:

作者发的原问题没有得到解答。有时可能需要方法#3。假设您正在交叉编译。 我认为原来的问题已经得到解答。如果发帖者尝试使用环境变量的方法,而不是在CMakeLists.txt文件中设置变量,我认为它会起作用,并且他不会得到错误。 如果交叉编译可以在命令行设置CMAKE_TOOLCHAIN_FILE。 Wiki link. @DLRdave,CMake 3.10 有什么不同吗?因为这些都不适合我。即使我设置环境变量或使用 OP 方法,它也总是使用 MSVC。谢谢。 我不知道 CMake 3.10 中的更改会改变此处讨论的任何内容。您是否从设置环境变量的同一环境中调用 CMake?或者您是单独设置它们并启动 CMake GUI?【参考方案2】:

我和 Pietro 有类似的问题,

我在 Window 10 上并使用“Git Bash”。 我尝试执行 >>cmake -G "MinGW Makefiles",但我得到了与 Pietro 相同的错误。

然后,我尝试了>>cmake -G "MSYS Makefiles",但意识到我需要正确设置我的环境。

确保将路径设置为 C:\MinGW\msys\1.0\bin 并检查那里是否有 gcc.exe。如果 gcc.exe 不存在,则必须运行 C:/MinGW/bin/mingw-get.exe 并从 MSYS 安装 gcc。

之后它对我来说很好用

【讨论】:

嘿 Junghyun,仅供参考 - 为已回答的问题添加新答案通常不是很有帮助,特别是如果您的答案是给定一般答案的更具体情况。干杯! @Ben。当然是有帮助的。更多,即使是那种特殊情况!! @hyprfrcb 想象这样一个世界,每个收到类似错误消息的人都添加了一个新答案,并在他们的机器上解决了 他们的 版本的错误消息。他们不会回答最初的问题,他们只是为相关但不同的问题提供解决方案。 (在这种情况下,新的答案有相同的错误,但它不是相同的问题。新的回答者没有安装 GCC,而原始用户设置的路径不正确)。如果每个人都这样做,那么每个问题都会产生很多无用的噪音 我不知道你生活在哪个世界,但在现有答案中添加新信息并不是“噪音”。 这个答案实际上救了我的@$$。太棒了正铉!【参考方案3】:

使用FILEPATH 选项可能有效:

set(CMAKE_CXX_COMPILER:FILEPATH C:/MinGW/bin/gcc.exe)

【讨论】:

【参考方案4】:

我有同样的问题。就我而言,修复非常简单。诀窍是简单地将“.exe”添加到您的编译器路径中。所以,而不是:

SET(CMAKE_C_COMPILER C:/MinGW/bin/gcc)

应该是

SET(CMAKE_C_COMPILER C:/MinGW/bin/gcc.exe)

这同样适用于 g++。

【讨论】:

以上是关于无法使用 CMake 指定编译器的主要内容,如果未能解决你的问题,请参考以下文章

为啥 cl.exe(Visual Studio 编译器)无法使用 CMake(错误报告)编译项目?

无法使用 CMake 和 ncurses 进行编译

CMake传递的变量编译器无法编译简单的程序

使用 CMake 编译后无法从 mpich2 使用 mpirun

解决Android Studio使用CMake无法编译出32位armeabi平台so库

Android Studio Cmake:“C 编译器 clang.exe 无法编译简单的测试程序