c - 如何在 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/
我该如何处理这里的发电机?
解决方案
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 Makefiles
或MinGW Makefiles
就此而言,您应该定义您的PATH
变量以将二进制文件包含到编译器工具链中。在上面的示例中,我只是使用AppVeyor 的 VM的默认路径。需要注意的另一件事appveyor.yml
是,Visual Studio 生成器对不同的 s 使用不同的(子)目录CMAKE_BUILD_TYPE
。因此,我首先检查目录Debug
是否存在,如果存在,则切换到目录并运行hello.exe
。
我希望这回答了你的问题。
推荐阅读
- node.js - (NGINX) NodeJS 反向代理子域
- entity-framework - 实体框架 - 在子表上复制记录
- docker - 管道和重定向在 docker run 中不起作用
- python - Scikit-Learn HuberRegressor:计算标准误差、t 统计量、p 值和置信区间
- powerbi - 如何将 If ISBLANK 和 Concatenate 添加到 PowerBI 中的函数
- node.js - 将 js 转换为 ts 时如何在 Typescript 上修复 @ts-expect-error ts-migrate(2571)
- android - 如何在 jetpack compose 中使用 MotionLayout、MotionScene、ConstraintSet?
- python - 如何根据顺序合并熊猫中的两个数据框
- sql - 如何将计数值分组到恰好 1、2 到 5、超过 5 的范围
- python-3.x - 如何用定时器函数包装两个互连值的输入函数?