gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:56 26 4
gpt4 key购买 nike

我试图让 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 是一种用于定义应用程序目标之间的依赖关系 的工具。您定义依赖项并为目标设置语言要求,然后要求 CMake 生成文件以帮助您构建目标。考虑到这一点,请不要直接在 CMakeLists.txt 中修改 CMAKE_C(XX)_COMPILER 变量,而是考虑使用 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

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

关于c - 如何在 Windows 中为 CMAKE 构建指定特定的编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56229493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com