【问题标题】:How do you specify a specific compiler in for CMAKE builds in Windows如何在 Windows 中为 CMAKE 构建指定特定的编译器
【发布时间】:2019-10-07 07:53:42
【问题描述】:

我试图让 CMAKE 在运行时使用特定的编译器。具体来说,我希望它使用本地安装的 GCC 编译器。但是当我尝试设置 CMAKE_C_COMPILER 变量时,它似乎失败了。

set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")

cmake_minimum_required(VERSION 3.10)

PROJECT(hello C)

add_executable(hello hello.c)

使用工具链更新

我尝试使用以下工具链文件使其工作,但它仍然选择 Visual Studio 构建工具。

# Toolchain File

# The target of this operating systems is 
SET(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C and C++
SET(CMAKE_C_COMPILER gcc)
SET(CMAKE_CXX_COMPILER g++)

# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH  C:/MyPrograms/MinGW/bin/ )

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

关于问题的更多更新

当我查看使用工具链文件时创建的缓存文件时,我发现了一些有趣的东西。它试图指向正确的编译器,但它仍在使用 Visual Studio 生成器......

//Name of generator.
CMAKE_GENERATOR:INTERNAL=Visual Studio 15 2017
//Generator instance identifier.
CMAKE_GENERATOR_INSTANCE:INTERNAL=C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/ 

这里的生成器怎么处理?

【问题讨论】:

  • "但是当我尝试设置 CMAKE_C_COMPILER 变量时,它似乎失败了。" - 请显示您收到的错误消息。简单的“似乎失败”并不能很好地描述 Stack Overflow 上的问题。
  • 应用程序。它确实可以运行,但它使用了 Visual Studio 工具链。我希望它使用 gcc 编译器。
  • @Tsyvarev 你有什么意见吗?无论我在我的工具链文件中放了什么,我似乎都无法让它停止将 CMAKE_GENERATOR_INSTANCE 设置为 Visual Studio 构建工具。即使我在工具链文件中设置它以使用 set(CMAKE_GENERATOR_INSTANCE "" CACHE INTERNAL "" FORCE) 擦除内部缓存
  • 闻起来你对 CMake generator(可能是 Visual Studio、MinGW、Makefile、Ninja 等)和 compiler 感到困惑,后者可以是 gcc、llvm、cl。这些是独立的东西。如果要更改编译器,请在CMakeLists.txt 或工具链文件中设置CMAKE_C_COMPILER。如果您想更改generator,请将适当的-G 选项传递给cmake。 (我知道,Visual Studio 附带的 cl 编译器可以与其他生成器一起使用。但我不确定 Visual Studio 是否可以与 gcc 一起使用。)
  • @Tsyvarev 我认为您可以使用以下命令在工具链中指定 generator set(CMAKE_GENERATOR "MinGW Makefiles" CACHE INTERNAL "" FORCE )。为什么这不起作用?

标签: c windows gcc cmake windows-10


【解决方案1】:

CMake 是一种工具,旨在定义应用程序中目标之间的依赖关系。您定义依赖关系并为您的目标设置语言要求,并要求 CMake 生成文件以帮助您构建目标。考虑到这一点,请不要直接在CMakeLists.txt 中混淆CMAKE_C(XX)_COMPILER 变量,而是考虑使用toolchain 文件来定义特定的编译器/链接器属性。使用工具链文件,您不仅可以为您的主机定义不同的编译器/链接器设置,还可以进行交叉编译,其中主机和目标设备具有不同的架构。

编辑。为了能够使用本地安装的gcc 编译器,您确实不需要需要使用@987654331 中的任何(相关)变量@ 文件。相反,您应该(重新)定义 PATH 环境变量以包含相应的(即 MinGW 或 Cygwin)二进制文件,并选择合适的生成器。以下是基于您的代码的最小工作示例。

假设你有以下目录结构:

.
├── appveyor.yml
├── CMakeLists.txt
└── hello.c

hello.c 有内容

#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("Hello world!\n");
  return 0;
}

CMakeLists.txt 有内容

cmake_minimum_required(VERSION 3.10)
project(hello C)
add_executable(hello hello.c)

最后,appveyor.yml 有以下内容

image: Visual Studio 2013

environment:
  matrix:
    - generator: "Visual Studio 12 2013 Win64"
    - generator: "MSYS Makefiles"

before_build:
  - IF "%generator%"=="MSYS Makefiles" set PATH=C:\msys64\usr\bin;C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\bin;%PATH%

build_script:
  - mkdir build
  - cd build
  - cmake -G "%generator%" ..
  - cmake --build .

after_build:
  - IF EXIST Debug cd Debug
  - hello.exe

此示例成功地在 AppVeyor 上构建,并使用了两个工具链。这里要注意的是,当您选择MSYS MakefilesMinGW Makefiles 时,您应该定义您的PATH 变量以将二进制文件包含到编译器工具链中。在上面的示例中,我只是使用AppVeyor's VMs 的默认路径。 appveyor.yml 需要注意的另一件事是,Visual Studio 生成器对不同的 CMAKE_BUILD_TYPEs 使用不同的(子)目录。因此,我首先检查目录Debug是否存在,如果存在则切换到目录并运行hello.exe

我希望这能回答你的问题。

【讨论】:

  • 我不得不删除之前的评论来纠正自己。它仍然不起作用。我使用了放入更新描述正文的工具链文件。它仍然没有选择正确的编译器。不知道我在这里做错了什么。
  • 你试过herehere的答案吗?不幸的是,我不在可以测试 MWE 的 Windows 上。作为旁注,如果我可以问的话,当您的系统上有本机编译器时,您使用 gcc 的原因是什么?
  • @wolverine99 更多链接:123。如您所见,您不应该CMakeLists.txt 内显式设置C(XX)_COMPILER 变量。此外,如果 MinGW 和/或 Cygwin 在您的系统上正确安装和配置,您似乎也不需要任何工具链文件。
  • @wolverine99 我已经修改了我的答案,我现在相信它可以解决你的问题。
  • 谢谢。这确实有效。我认为这里的关键是我需要使用-G 来设置生成器。
猜你喜欢
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 2021-04-22
  • 2012-04-29
相关资源
最近更新 更多