首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

cmake指定编译器

在使用 CMake 构建项目时,可以通过多种方式指定编译器。以下是详细的配置方法,包括命令行参数、环境变量和 CMakeLists.txt 文件中的设置。


​1. 通过命令行指定编译器​

在运行 cmake 命令时,可以通过 -D 参数或直接指定编译器路径来覆盖默认编译器。

​(1) 指定 C 和 C++ 编译器​

代码语言:javascript
复制
cmake -DCMAKE_C_COMPILER=/path/to/gcc -DCMAKE_CXX_COMPILER=/path/to/g++ ..
  • ​示例​​(Linux/macOS):cmake -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 ..
  • ​示例​​(Windows,使用 MinGW):cmake -DCMAKE_C_COMPILER="C:/MinGW/bin/gcc.exe" -DCMAKE_CXX_COMPILER="C:/MinGW/bin/g++.exe" ..

​(2) 直接指定编译器路径(CMake 会自动识别)​

如果编译器在 PATH 中,可以直接指定名称:

代码语言:javascript
复制
cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..

​2. 通过环境变量指定编译器​

CMake 会优先检查环境变量 CCCXX 来确定编译器。

​(1) 设置环境变量​

​Linux/macOS(Bash/Zsh)​

代码语言:javascript
复制
export CC=/path/to/gcc
export CXX=/path/to/g++
cmake ..

​Windows(CMD/PowerShell)​

代码语言:javascript
复制
set CC=C:\MinGW\bin\gcc.exe
set CXX=C:\MinGW\bin\g++.exe
cmake ..

或(PowerShell):

代码语言:javascript
复制
$env:CC = "C:\MinGW\bin\gcc.exe"
$env:CXX = "C:\MinGW\bin\g++.exe"
cmake ..

​3. 在 CMakeLists.txt 中指定编译器​

虽然不推荐(因为会硬编码编译器路径),但可以在 CMakeLists.txt 中强制指定编译器:

代码语言:javascript
复制
# 强制指定编译器(不推荐,除非有特殊需求)
set(CMAKE_C_COMPILER "/path/to/gcc")
set(CMAKE_CXX_COMPILER "/path/to/g++")

⚠️ ​​注意​​:这种方式会覆盖命令行和环境变量的设置,可能导致跨平台兼容性问题。


​4. 指定编译器生成器(Generator)​

CMake 支持多种构建系统(如 Makefile、Ninja、Visual Studio 等),可以通过 -G 参数指定生成器,某些生成器会自动选择默认编译器。

​(1) 指定生成器(Linux/macOS)​

代码语言:javascript
复制
cmake -G "Unix Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..

​(2) 指定生成器(Windows,Visual Studio)​

代码语言:javascript
复制
cmake -G "Visual Studio 17 2022" -A x64 ..
  • -A x64 表示生成 64 位项目(可选 Win32 表示 32 位)。

​(3) 指定生成器(Windows,Ninja)​

代码语言:javascript
复制
cmake -G "Ninja" -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl ..

⚠️ ​​注意​​:在 Windows 上使用 Ninja 时,通常需要配合 Visual Studio 的 MSVC 编译器(cl.exe)。


​5. 检查当前使用的编译器​

在配置完成后,可以通过以下命令检查 CMake 实际使用的编译器:

代码语言:javascript
复制
cmake --build . --verbose  # 查看构建日志中的编译器调用

或直接查看 CMakeCache.txt 文件中的相关变量:

代码语言:javascript
复制
grep -E "CMAKE_C_COMPILER|CMAKE_CXX_COMPILER" CMakeCache.txt

​6. 常见问题与解决方案​

​(1) 编译器未找到​

  • ​错误提示​​:Could NOT find compiler: No such file or directory
  • ​解决方法​​:
    • 确保编译器路径正确,并已添加到 PATH 环境变量。
    • 使用绝对路径指定编译器(如 /usr/bin/gccC:\MinGW\bin\gcc.exe)。

​(2) 多版本编译器冲突​

  • ​问题​​:系统中有多个版本的 GCC/G++,CMake 选择了错误的版本。
  • ​解决方法​​:
    • 显式指定完整路径:cmake -DCMAKE_C_COMPILER=/usr/bin/gcc-11 -DCMAKE_CXX_COMPILER=/usr/bin/g++-11 ..
    • 或通过 update-alternatives(Linux)切换默认版本:sudo update-alternatives --config gcc sudo update-alternatives --config g++

​(3) Windows 上 MSVC 编译器未识别​

  • ​问题​​:未安装 Visual Studio 或未正确配置开发环境。
  • ​解决方法​​:
    • 安装 Visual Studio Build Tools。
    • 确保以开发者命令行(Developer Command Prompt)运行 CMake,其中已配置 cl.exe 的路径。

​7. 完整示例​

​Linux/macOS(GCC)​

代码语言:javascript
复制
# 安装 GCC(如未安装)
sudo apt install gcc g++  # Ubuntu/Debian
sudo yum install gcc gcc-c++  # CentOS/RHEL

# 指定编译器并生成 Makefile
cmake -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 -B build
cmake --build build

​Windows(Visual Studio)​

代码语言:javascript
复制
:: 使用 Visual Studio 2022 生成器
cmake -G "Visual Studio 17 2022" -A x64 -B build
cmake --build build

​Windows(MinGW + Ninja)​

代码语言:javascript
复制
:: 安装 MinGW 和 Ninja
choco install mingw ninja  # 使用 Chocolatey

:: 指定编译器和生成器
cmake -G "Ninja" -DCMAKE_C_COMPILER="C:\MinGW\bin\gcc.exe" -DCMAKE_CXX_COMPILER="C:\MinGW\bin\g++.exe" -B build
cmake --build build
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

cmake 生成Makefile时指定cc++编译器

https://blog.csdn.net/10km/article/details/50444715 linux下在使用cmake生成Makefile的时候,如果不指定编译器,则默认是使用系统原生的编译器..., 当操作系统中安装了新的版本的编译器,多个版本编译器共存的时候,如果想使用新版本的编译器,在cmake生成Makefile的时候就需要指定编译器。...不论环境变量$PATH怎么设置,cmake在生成Makefile时,如果不指定编译器,生成的Makefile都会调用/usr/bin下的g++/gcc。 所以这种情况下必须指定编译器。...在这里填写指定c/c++编译器的路径 ? shell脚本 那么如果要在脚本中调用cmake生成Makefile时,应该如何写脚本呢? #!...then ## 指定c/c++编译器路径,并指定CMAKE_BUILD_TYPE为RELEASE GXX_PATH="-DCMAKE_CXX_COMPILER:FILEPATH

7.8K10

caffe:cmake编译指定glog,gflag路径

要想在cmake编译caffe时指定glog,gflag路径,需要下面两步: 定义GLOG_ROOT_DIR,GFLAGS_ROOT_DIR参数 #$caffe_root caffe源码根目录 cmake...寻找glog,gflag的代码有bug(目前还没修改),导致即使如上一步通过GLOG_ROOT_DIR,GFLAGS_ROOT_DIR指定了glog,gflag路径,cmake也不会找到该路径下的glog...的find_library的查找机制没有全搞明白 简单说就是调用find_library时,会以从一组路径中顺序查找指定的库,这有一个优先序问题,如果没有指定了NO_DEFAULT_PATH,则会先查找默认的系统库路径...如果指定了NO_DEFAULT_PATH,则只查找PATHS提供的路径,不会查找系统库路径。...如何保证PATHS指定的路径优先被搜索呢? 解决的办法cmake官网也给出来了,就是调用两次find_library,第一次加NO_DEFAULT_PATH,第二次则不加。

3.1K50
  • 【CMake教程】(三)CMake 配置指定C++11编译的标准

    安装cmake: sudo apt install cmake (3)CMake指定C++标准   指定C++准备一般有两种方式。...和CMAKE_CXX_STANDARD指定编译器的使用版本,如果CMAKE_CXX_STANDARD_REQUIRED设置为True,则必须使用CMAKE_CXX_STANDARD指定的版本,如果CMAKE_CXX_STANDARD_REQUIRED...C++编译器版本是必须的,如果不设置,或者为OFF,则指定版本不可用时,会使用上一版本。...[PARENT_SCOPE]) 核心命令: # 设置指定的C++编译器版本是必须的,如果不设置,或者为OFF,则指定版本不可用时,会使用上一版本。...VERSION 1.0) # 指定版本号的配置文件 configure_file(include/TutorialConfig.h.in TutorialConfig.h) # 设置指定C++编译器版本

    35K60

    【CMake】CMake 引入 ( Android NDK 构建脚本 | CMake 命令手册 )

    文章目录 一、Android NDK 构建脚本 二、CMake 构建脚本示例 三、CMake 命令手册 1、CMake 脚本命令 2、CMake 工程命令 该系列博客的应用场景是 Android Studio...上述命令都是 CMake 命令 , 可以在 CMake 命令文档中查询 , 当前 CMake 中有 47 个脚本命令 , 46 个工程命令 ; CMake 构建脚本示例 : # 指定 CMake...表示会将 C++ 的参数传给编译器 # CMAKE_C_FLAGS 表示会将 C 参数传给编译器 # 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译器时 , 在 该参数后面指定库的路径...# CMAKE_SOURCE_DIR 指的是当前的文件地址 # -L 参数指定动态库的查找路径 #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR...导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 ) 复制来的 ; 三、CMake 命令手册 ---- CMake 命令分为三种 , 脚本命令

    4.1K01

    CMake学习笔记(二)——CMake语法

    注:如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库。 CMAKE_C_FLAGS 设置C编译选项 CMAKE_CXX_FLAGS 设置C++编译选项 二....当然,可执行文件的安装路径CMAKE_INSTALL_PREFIX也可以在执行cmake命令的时候指定,cmake参数如下: cmake -DCMAKE_INSTALL_PREFIX=/usr .....如果cmake参数和CMakeLists.txt文件中都不指定该值的话,则该值为默认的/usr/local。 4....类似于gcc中的编译参数-l,即指定编译过程中编译器搜索头文件的路径。当项目需要的头文件不在系统默认的搜索路径时,则指定该路径。 AFTER/BEFORE参数,控制追加或置前。...(5) COMPILE_FLAGS 设置附加的编译器标志,在构建目标内的源文件时被用到。 (6) LINKER_LANGUAGE 改变链接可执行文件或共享库的工具。

    6K100

    CMake学习笔记(一)——CMake官网教程

    CMake学习笔记(一)——CMake官网教程 前言: 经历了一星期痛苦的交叉编译,笔者深刻认知到Linux下make的重要性。...给自己设置的第一课,就是先学习一下CMake官网提供的入门教程。 CMake官网教程地址:https://cmake.org/cmake-tutorial/ 一. 基本开始 1....执行文件可以使用这个库而代替编译器自己提供的标准平方根计算方法。在这个教程中,我们将该库设置为一个子库,并命名为MathFunctions。...在CMakeLists.txt中实现如下: add_library(MathFunctions mysqrt.cxx) 源文件mysqrt.cxx中有一个名为mysqrt的函数,这个函数提供了相比于编译器版本平方根函数的简化版本...其中,CMake变量CMAKE_INSTALL_PREFIX被用来定义安装文件的根目录。 添加测试也是一个简单直接的操作。

    4.5K80

    cmake:DEBUG_POSTFIX 根据debugrelease类型指定target的输出文件名

    (本文末尾有更新内容) 这就要用到CMAKE的一个target属性:OUTPUT_NAME OUTPUT_NAME预定义target的生成目标文件名,如果没有指定,则默认为target的名字。...下面的cmake脚本以一个functin实现了对指定的target,在debug模式下自动对输出的文件名加_d后缀: # debug模式下对输出文件名加_d后缀 # targets 输入参数,一组target...cmake已经提供了DEBUG_POSTFIX这个target属性,用于指定deuug版本的文件结尾符,这才是最正确的打开方式。...NOTE 实际测试证明:使用DEBUG_POSTFIX指定输出文件结尾对executable target(可执行文件)无效。...参考资料 https://cmake.org/cmake/help/v3.1/prop_tgt/CONFIG_POSTFIX.html https://cmake.org/cmake/help/v3.1

    3.1K20
    领券