我正在尝试让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/
我在这里如何处理发电机?
答案 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 Makefiles
或MinGW Makefiles
时,应定义PATH
变量以将二进制文件包括到编译器工具链中。在上面的示例中,我只使用了AppVeyor's VMs的默认路径。 appveyor.yml
要注意的另一件事是Visual Studio生成器对不同的CMAKE_BUILD_TYPE
使用不同的(子)目录。因此,我首先检查目录Debug
的存在,如果存在,则切换到目录并运行hello.exe
。
我希望这能回答您的问题。