如何在Windows中为CMAKE构建指定特定的编译器

时间:2019-05-20 23:56:06

标签: c windows gcc cmake windows-10

我正在尝试让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/ 

我在这里如何处理发电机?

1 个答案:

答案 0 :(得分:1)

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

编辑。要能够使用本地安装的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's VMs的默认路径。 appveyor.yml要注意的另一件事是Visual Studio生成器对不同的CMAKE_BUILD_TYPE使用不同的(子)目录。因此,我首先检查目录Debug的存在,如果存在,则切换到目录并运行hello.exe

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