解决CMake编译错误:CMAKE_C_COMPILER与CMAKE_CXX_COMPILER未设置的完整指南

CMake整理 file(GLOB SRC_LIST "src/*.cpp") # 这里file(GLOB ...)命令来查找src目录下所有扩展名为.cpp的文件,并将它们的名字存入SRC_LIST变量。aux_source_directory(. SRC_LIST) #这里 . 表示当前目录,SRC_LIST 是存放源文件列表的变量。SET(LIBRARY_OUTPUT_PATH ${TOP_DIR}/Lib/$${PLATFORM}) #####设置库生成路径。#########设置库属性 源文件和输出名字。 阅读详情

1. 当CMake告诉你“找不到编译器”:一个新手必须理解的起点

刚接触C/C++项目,好不容易从GitHub上clone下来一个看起来很酷的开源库,满心欢喜地按照README里的第一步 mkdir build && cd build && cmake .. 执行,结果终端里蹦出一堆红色错误,最扎眼的就是那句 “CMake Error: CMAKE_C_COMPILER not set” 或者 “CMake Error: CMAKE_CXX_COMPILER not set”。相信我,你不是一个人,几乎所有从零开始配置C/C++开发环境的人,都会在这个门槛上绊一跤。我第一次遇到时也是一头雾水,心想CMake不是号称跨平台构建神器吗,怎么连个编译器都找不到?

简单来说,这个错误就是CMake在向你喊话:“嘿,老兄,我找不到用来编译C代码(或者C++代码)的工具!” CMake本身不是一个编译器,它更像一个高级的项目构建“指挥家”。它的工作流程是:你先告诉它项目源代码在哪里、有什么依赖、最终想生成什么(是可执行文件还是库)。然后,CMake会根据你当前的系统环境,去自动探测可用的C/C++编译器(比如GCC、Clang、MSVC),并生成对应的构建脚本(比如Makefile或者Visual Studio的.sln文件)。最后,你再用这些脚本和真正的编译器(比如gcc、clang、cl.exe)去编译代码。

所以,当“CMAKE_C_COMPILER not set”这个错误出现时,根本原因就是CMake这个“指挥家”在探测环节卡壳了。它没能在你系统的标准路径里,或者你指定的路径里,找到任何一个它能识别、调用的C或C++编译器程序。这通常发生在以下几种情况:你是一个纯粹的Windows用户,刚刚安装好CMake,但从未安装过像MinGW或Visual Studio这样的开发工具套件;或者你虽然安装了,但没有把编译器的可执行文件路径(比如 gcc.exe, g++.exe 所在的 bin 目录)添加到系统的环境变量 PATH 中,导致CMake“看不见”它们;还有一种可能是,你之前安装过多个编译器,环境变量混乱,CMake探测到了错误或损坏的版本。

对于新手而言,理解这一点至关重要:CMake是构建系统生成器,不是编译器。解决这个错误的核心,就是确保你的操作系统里有一个CMake能认出来的、可用的C/C++编译器,并且让CMake知道去哪里找它。接下来,我们就分平台、分步骤地,把这个“指挥家”需要的“乐手”给安排上。

2. 分平台作战:Windows、macOS与Linux的通用排查思路

虽然错误信息一样,但不同操作系统的软件生态和工具链截然不同,因此排查和解决的路径也有差异。不过,在深入各平台细节之前,有几个通用排查步骤是无论你在哪个系统上都应该首先尝试的,这能帮你快速定位问题根源。

首先,打开你的终端(Windows叫命令提示符CMD或PowerShell,macOS/Linux叫Terminal),进行“编译器体检”。这是最直接的方法。对于C编译器,尝试运行 gcc --version 或 clang --version;对于C++编译器,尝试运行 g++ --version 或 clang++ --version。如果这些命令能正确返回版本信息(比如 gcc (MinGW.org GCC-8.2.0-5) 8.2.0),恭喜你,编译器基本是安装了的。如果系统提示“‘gcc’ 不是内部或外部命令,也不是可运行的程序”,那就铁证如山——系统里根本没有安装这个编译器,或者安装了但没配置好环境变量。

其次,检查CMake的探测过程。你可以通过给CMake命令增加调试信息来观察它到底在找什么。在构建目录下,尝试运行:

cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ..

或者,更直接地,在第一次配置失败后,查看CMake生成的 CMakeCache.txt

CMake报错「No CMAKE_CXX_COMPILER found」:跨平台编译器路径配置的自动化脚本 自动化脚本设计原则平台感知:通过自动选择逻辑分支。非侵入性:优先使用环境变量(如CXX)而非直接修改系统配置。可重用性:将编译器路径、生成器类型等参数化。企业级开发建议容器化构建:通过Docker镜像统一开发环境。CI/CD集成:在流水线中强制执行编译器版本检查。文档化:在README中明确支持的编译器版本(如GCC 9+、Clang 12+、VS2019+)。常见问题处理权限问题:在Linux/macOS上使用赋予执行权限。路径空格:在Windows路径中用双引号包裹(如缓存残留。 阅读详情

相关推荐

Cmake编译-CMAKE_C_COMPILER-NOTFOUND解决

CMAKE编译DCMTK中遇到的bug记录

zy2317878的博客 5万+

The CXX compiler identification is unknown

1、问题 cmake出现以下错误: -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is unknown -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detectin

king_weng的博客 8257

CMake Error: your RC compiler: "CMAKE_RC_COMPILER-NOTFOUND" was not found.

在用cmkae生成makefile文件过程中执行命令: cmake .. -G"NMake Makefiles" 时总是提示如下错误信息: CMake Warning at CMakeLists.txt:2 (project): To use the NMake generator, cmake must be run from a shell that can use th

祥龙九霄的专栏 7494

CMAKE CXX编译器未找到解决方法

然后,可以通过在CMakeLists.txt文件中指定编译器路径、设置环境变量、检查编译器路径以及检查系统变量来解决问题。通过这些方法,您应该能够解决CMAKE CXX编译器未找到的问题,并成功构建您的C++项目。变量来显式指定C++编译器的路径。如果已安装C++编译器,但CMake仍然无法找到它,可能是因为CMake的配置不正确。有时,CMake可能无法找到C++编译器,是因为编译器的路径未正确设置。最后,还应该检查系统的环境变量,确保路径正确设置。请根据实际情况修改路径,确保指定的路径是正确的。

KgCrystal的博客 3211

FMEA-MSR步骤三:功能分析

目的 FMEA-MSR功能分析的主要目标: ● 功能及各功能之间的关系的可视化 ● 功能树/网络或等效功能矩阵参数图(P图) ● 顾客(外部和内部)功能与相关要求的关联 ● 要求或特性与功能的关联 ● 工程团队(系统、安全和组件)之间的协作 ● 失效分析步骤的基础 (点击链接进入官网领取软件试用) 在监视及系统响应的补充FMEA中,对失效探测和失效响应的监视视为其具有的功能。硬件和软件功能可能包括监视控制状态的功能。 故障/失效的监视和探测功能可能包括超出范围的探测、循环冗余校验、真实性检查和序列计数器检查

Infomass的博客 2382

百度贴吧爬虫实战:完整实现与使用指南

使用 csv 模块创建写入器,首先写入表头("标题" 和 "链接"),然后遍历帖子字典,将每个标题和链接作为一行写入文件。首先检查内容是否为空,然后通过查找 JSON 结构的起始({)和结束(})位置,提取有效的 JSON 片段。接着遍历帖子列表中的每个条目,提取标题文本和对应的链接,对于相对路径的链接会自动补全为完整的 URL。从 JSON 提取标题和链接此方法专门用于从解析后的 JSON 数据中提取帖子标题和对应的链接。提取到的标题和链接以字典形式返回,键为标题,值为对应的完整链接。

qq_63736560的博客 2010

matlab球面投影(二)

matlab球面投影,想做一个全景相机,不知道,要做成啥样,于是在MATLAB先仿真一下,看下是个啥样子 百度别人做的,复制下面的代码到MATLAB的命令串口下,,网上找了张全景图,可以是bmp,jpg,改程序就可以了 回车运行就可以看到结果。 复制下面代码时,下面的中文注释记得删除,MATLAB是会报错的, close all; clear all; clc [x,y,z]=sphere(50); A=imread('a.JPG'); //名字是自己命名的,记得改 B=warp(x,y,-z,

rjszcb的博客 3151

土地利用数据从1972到2023:如何利用Landsat和Sentinel数据构建长期变化监测模型

本文详细解析了如何利用1972至2023年的Landsat和Sentinel遥感数据构建土地利用长期变化监测模型。通过多源数据融合策略、时间序列预处理流程和深度学习算法,实现高精度的土地利用分类与变化检测,为生态评估和城市规划提供科学依据。文章还探讨了验证方法和实际应用案例,展示了长期遥感数据在环境建模中的独特价值。

weixin_28720573的博客 437

嵌入式工程师成长之路(7)——算法学习

算法大全1、风仲达——算法笔记2、坐在马桶上学算法3、啊哈算法4、深度强化学习实验室。

云轩阁 4万+

【Claude】组织级认证限制报错已解决(4 种)

报错被禁用的是什么谁能解除应急方案整个 Console 组织Anthropic 支持换账户 / 订阅凭证API key 认证方式你的组织管理员用订阅/login订阅 OAuth 登录你的组织管理员用 API keyRoutines 功能你的组织所有者手动计划任务替代共同排查模式/status确认当前凭证;检查环境变量;看清报错消息里命名的是什么(key?组织访问?),对症清除;管理员层面的限制,找管理员解锁。

博客 1万+

使用手机录制rosbag包

使用手机作为便携式数据采集设备来录制rosbag。

weixin_38582851的博客 608

linux平台Modbus TCP测试

【代码】linux平台Modbus TCP测试。

无线互联&网络介绍 815

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 高维向量相似度计算的艺术:从距离度量到美学探索
下一篇: marked.min.js隐藏玩法:5个让Markdown编辑器更专业的自定义技巧
tea88
博客等级 码龄16年 69粉丝 1390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值