当前位置: 首页 > news >正文

VS2022 CMake报错解决小结

目录

一、问题背景

二、问题分析

三、问题解决


一、问题背景

       VS2022中能够跨平台的工程类型就是CMake项目,一套代码能跨windows/Linux/Mac多种操作系统。而实际使用时,发现相关资料比较少,需要摸索一下。

 碰到的问题简述:

 

1、C++ Intellisense信息可能过时,生成要刷新的CMake缓存。

2、多次定义了变量 CMAKE_INSTALL_PREFIX

3、CMake Error: CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.  4、CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage    

5、CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage         

 二、问题分析

CMake工程中最重要的文件就是CMakeLists文件,其包含工程所有需要的元素,例如下面这个demo。直接用CMakeLists会觉得难用;但用了makefile再用这个就觉得CMakeLists十分友好了。

# CMakeList.txt: CMakeProject1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)# 如果支持,请为 MSVC 编译器启用热重载。
if (POLICY CMP0141)cmake_policy(SET CMP0141 NEW)set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
endif()project ("CMakeProject1")# 将源代码添加到此项目的可执行文件。
add_executable (CMakeProject1 "CMakeProject1.cpp" "CMakeProject1.h")if (CMAKE_VERSION VERSION_GREATER 3.12)set_property(TARGET CMakeProject1 PROPERTY CXX_STANDARD 20)
endif()# TODO: 如有需要,请添加测试并安装目标。

如果上面的demo看不懂,建议先恶补一下,不然下面的内容会比较吃力。

VS创建CMake工程时,默认会创建一个CMakePresets.json文件。

 例如本地计算机的x64-Debug工程属性由下面的json片段来描述。这个片段把CMake要用的c/c++编译器进行了定义(cl.exe)。

       {"name": "windows-base","hidden": true,"generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_C_COMPILER": "cl.exe","CMAKE_CXX_COMPILER": "cl.exe"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Windows"}},{"name": "x64-debug","displayName": "x64 Debug","inherits": "windows-base","architecture": {"value": "x64","strategy": "external"},"cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"}}

然而,这个json文件对于linux和mac的描述则不完整,以下为linux-debug工程属性,其中对c/c++编译器没有定义。

{"name": "linux-debug","displayName": "Linux Debug","generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Linux"},"vendor": {"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"}}
}

这就是把本地计算机工程改为远程Linux工程时,vs报错的原因了。猜想vs的开发工程师在做这个功能时,只针对本地window环境编写了完整的CMakePresets.json,而针对其他平台只写了一段参考,其实现并不完整,需要用户手动配置缺失部分。例如,配置Linux系统中CMake用到的c/c++编译器,Ninjia路径等。可以参考一下官方的文档

使用 CMake 预设进行配置和生成 | Microsoft Learn

三、问题解决

有了第二部分的分析,解决问题的思路就有了,把相关的配置补充完整。

首先,补充c/c++编译器,linux机器上已经装了gcc/g++,直接填好就可以了。

(如果没有安装需要在linux安装一下 apt install gcc g++)

        {"name": "linux-debug","displayName": "Linux Debug","generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug","CMAKE_C_COMPILER": "gcc","CMAKE_CXX_COMPILER": "g++"}

改了以后,这两个报错没有了。

4、CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage    

5、CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage  

 上面的错误显示查询ninja版本号时失败了。装一个ninja:

sudo apt install ninja-build

安装完成后,回到vs中,按ctrl+S,保存工程时,会自动再次构建工程,发现构建成功。

最后,虽然构建成功了,实际上有个错误最后还是没有解决,即使它不影响工程的构建结果。

多次定义了变量 CMAKE_INSTALL_PREFIX

从构建日志看出,CMAKE_INSTALL_PREFIX,确实定义了两次。感觉这就是vs的一个bug,有博友知道如何解决,请评论告知,十分感谢。

/usr/bin/cmake -G "Ninja"   -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_C_COMPILER:STRING="gcc" -DCMAKE_CXX_COMPILER:STRING="g++" -DCMAKE_INSTALL_PREFIX:PATH="/root/.vs/CMakeProject1/out/install/linux-debug"   -DCMAKE_INSTALL_PREFIX:PATH="/root/.vs/CMakeProject1/out/install/linux-debug"  /root/.vs/CMakeProject1/CMakeLists.txt

 

相关文章:

VS2022 CMake报错解决小结

目录 一、问题背景 二、问题分析 三、问题解决 一、问题背景 VS2022中能够跨平台的工程类型就是CMake项目&#xff0c;一套代码能跨windows/Linux/Mac多种操作系统。而实际使用时&#xff0c;发现相关资料比较少&#xff0c;需要摸索一下。 碰到的问题简述&#xff1a; 1、C…...

java之webservice_aegis.xml学习

开门见山,直奔主题,让我们先来看一个接口: public interface UserInfo {public Collection findRoleInfosByUserID(String userUniqueID);public User findUserInfosByUserID(String userUniqueID);public String test();} 观察此接口,首先我们看findRoleInfosByUserID方法…...

总结 TCP 协议的相关特性

TCP协议段格式: 如图, 端口号: 是其中一个重要的部分,知道端口号才能确认数据交给哪个应用程序(端口号属于传输层的概念). 4位首部长度:4bit表示的范围是0->15,在此处,单位是"4字节",因此,将这里的数值 * 4&#xff0c;才是真正的报头长度,即TCP 报头最大长度,60…...

不负众望~历时4年修炼,这本册子终于成书了(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 精进Spring Boot首选读物 “小册”变“大书”&#xff0c;彻底弄懂Spring Boot 全方位配套资源…...

【校招VIP】java语言考点之垃圾回收算法

考点介绍&#xff1a; 垃圾回收算法是必考题。GC中的垃圾指的是存在于内存中的、不会再被使用的对象。而垃圾回收就是把那些不再被使用的对象进行清除&#xff0c;收回占用的内存空间...... 『java语言考点之垃圾回收算法』相关题目及解析内容可点击文章末尾链接查看&#xff…...

juc概述和Lock接口

目录 一、什么是JUC 1、JUC概述 2、进程与线程 3、线程的状态 4、wait/sleep 的区别 5、并发与并行 6、管程 7、用户线程和守护线程 二、Lock接口 1、Synchronized 使用synchronized实现售票案例 使用synchronized实现增减变量操作 2、什么是 Lock 买票例子使用lo…...

图像降采样的计算原理:F.interpolate INTER_AREA

一、F.interpolate——数组采样操作 torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode=nearest, align_corners=None, recompute_scale_factor=None) 功能:利用插值方法,对输入的张量数组进行上\下采样操作,换句话说就是科学合理地改变数组的尺…...

云上的甜蜜早安:腾讯云云函数助力PHP打造女友专属每日推送

用腾讯云的云函数做一个微信公众号早安&#xff0c;每天定时发送早安给你的女朋友&#xff01; 1.首先我们登录腾讯云&#xff0c;在搜索栏搜索云函数 2.进入云函数&#xff0c;点击立即体验 3.这里我们选择 按照步骤选择 php 4.再就是配置页面&#xff0c;这里我们只需要配…...

Javaweb基础学习(3)

Javaweb基础学习 web核心介绍一、HTTP1.1 HTTP介绍1.2、HTTP请求数据格式1.3、HTTP响应数据格式 二、Tomcat2.1 简介2.2 基本使用2.3 Tomcat配置2.4 Tomcat部署项目2.5 Web项目结构2.6 创建Maven Web项目 三、Servlet3.1、Servlet简介&快速入门3.2 创建Servlet步骤3.3 Serv…...

使用在 Web 浏览器中运行的 VSCode 实现 ROS2 测程法

一、说明 Hadabot是软件工程师学习ROS2和机器人技术的机器人套件。我们距离Hadabot套件的测试版还有一周左右的时间。我们将在本文末尾披露有关如何注册的更多信息。 新的Hadabot套件完全支持ROS2。除了硬件套件外&#xff0c;Hadabot软件环境将主要基于Web浏览器&#xff0c;以…...

快速学习GO语言总结

备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xff08;一&#xff09;Go语言诞生的主要问题和目标…...

尚硅谷宋红康MySQL笔记 10-18

是记录&#xff0c;我不会记录的特别详细 第10章 创建和管理表 标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量名限制为29个只能包含 A–Z, a–z, 0–9, _共63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个MySQL软件中&#xff0c;数据库不能…...

Java 面试题--SpringBoot篇

一、什么是 SpringBoot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c; 是 Spring 组件一站式解决方案&#xff0c;主要是简化 了使用 Spring 的难度&#xff0c;简省了繁重 xml 的配 置&#xff0c;提供了各种启动器&#xff0c;在运行过程中自定 配置,&a…...

GitKraken 详细图文教程

前言 写这篇文章的原因是组内的产品和美术同学&#xff0c;开始参与到git工作流中&#xff0c;但是网上又没有找到一个比较详细的使用教程&#xff0c;所以干脆就自己写了一个[doge]。文章的内容比较基础&#xff0c;介绍了Git内的一些基础概念和基本操作&#xff0c;适合零基…...

ubuntu20.04 root用户下使用中文输入法——root用户pycharm无法用中文输入法问题

因为一些众所不周知的bug&#xff0c;我的pycharm使用apt或者snap安装都不行了&#xff0c;官网下了“绿色版”&#xff0c;运行pycharm.sh也运行不起来&#xff0c;有个java相关环境报错&#xff0c;jre和jdk都装了&#xff0c;还是有点问题&#xff0c;最后尝试发现可以用roo…...

FastDFS与Nginx结合搭建文件服务器,并实现公网访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…...

嵌入式蓝海变红海?其实是大浪淘沙!

嵌入式是当下热门的职业方向之一&#xff0c;吸引了众多求职者的目光。然而&#xff0c;有人担心大家一拥而上&#xff0c;导致嵌入式就业竞争激烈&#xff0c;找工作难度大。其实&#xff0c;嵌入式行业的竞争并非无法逾越的天堑&#xff0c;也远远没有从蓝海变成红海&#xf…...

【附安装包】Solid Edge2023安装教程最强CAD选择

软件下载 软件&#xff1a;Solid Edge版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;3.85G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.bai…...

494. 目标和

494. 目标和 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;数组回溯法动态规划 参考代码&#xff1a;数组回溯法__494目标和__动态规划 经验吸取 原题链接&#xff1a; 494. 目标和 https://leetcode.cn/problems/target-sum/description/ 完成情况&#…...

C++学习笔记总结练习:C++编译过程详解

编译和链接的过程 0 概述 程序要运行起来&#xff0c;必须要经过四个步骤&#xff1a;预处理、编译、汇编和链接。接下来通过几个简单的例子来详细讲解一下这些过程。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFwSfKYp-1692237034055)(imag…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...