首页 > 解决方案 > 如何在 Windows 中为 CMAKE 构建指定特定的编译器

问题描述

我试图让 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 Generator...

//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/ 

我该如何处理这里的发电机?

标签: cwindowsgcccmakewindows-10

解决方案


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

编辑。为了能够使用本地安装的gcc编译器,您不需要使用文件中的任何(相关)变量CMakeLists.txt。相反,您应该(重新)定义您的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 的 VM的默认路径。需要注意的另一件事appveyor.yml是,Visual Studio 生成器对不同的 s 使用不同的(子)目录CMAKE_BUILD_TYPE。因此,我首先检查目录Debug是否存在,如果存在,则切换到目录并运行hello.exe

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


推荐阅读