C++跨平台开发工具CLion——使用任意编译器快速指南

news2024/12/22 20:49:19

CLion是一款专为开发C及C++所设计的跨平台IDE,它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C++,同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CMake编译系统,从而提高开发人员的工作效率。

CLion v2023.1正式版下载

作为一款IDE,CLion提供了许多功能来帮助开发者,它可以显示文档弹出窗口、实时检测错误、建议修复等。内部代码分析器始终在后台运行,在您输入时分析 C 和 C++ 代码。 对于自动分析器来说,C 和 C++ 是具有挑战性的语言,因为需要特定于编译器的数据才能正确解析代码,引擎需要知道标题搜索路径、预定义的宏定义和其他一些详细信息。

对于一组预定义的已知编译器,CLion会使用特殊选项运行项目的编译器,并在解析项目时收集所需信息。 当然这只适用于有限数量的编译器,如GCC、Clang、MSVC、IAR及其衍生工具,如果某个项目使用特定的自定义编译器、很少使用的编译器或我们无权访问的专有编译器来正确集成,则CLion无法通过其标准过程进行使用。 在这种情况下,您可以选择使用自定义编译器功能。

要在CLion中使用自定义编译器,您需要一个包含必要编译器数据的YAML文件。 此类文件应包含一个或多个小节,每个小节描述一个特定的编译器或编译器变体,每个小节应有一个描述、一个或多个匹配记录,以及多个信息记录。

当CLion解析项目并遇到针对项目文件的编译器时,CLion会逐节扫描,并检查编译器是否与记录匹配。 匹配会使用一个或多个匹配记录来完成,可用的匹配记录包括:

  • match-compiler-exe是正则表达式,用来检查编译器名称,一个与平台无关的良好示例是 "(.*/)?sdcc(.exe)?"。
  • match-source也是正则表达式,用来与要编译的源文件的名称匹配。 对于 C,通常为 ".*\.c",而对于 C++,通常为 ".*\.cpp"。
  • match-args是单个命令行开关、开关序列或无序开关数组。 例如,"-a" 匹配实参 -a,"-b -c" 匹配实参 -b -c,而 ["-b", "-c"] 匹配 -b -c 或 -c -b。
  • match-language可能为 C 或 CPP,对于 CMake 项目,它会与CMake检测到的语言匹配;对于其他类型的项目,该语句会被直接忽略。

在所有匹配项成功解析之后,就会选取小节信息记录,并跳过YAML文件的其余部分。 编译器数据获取自信息记录,然后直接传递给 CLion 的代码分析器;也就是说,在编译器试运行期间不收集数据。

如果这些小节都没有为IDE提供将记录与特定编译器积极匹配的信息,它会尝试以通常的方式(即通过猜测编译器的类型并运行编译器)来收集编译器数据。

如何编写自定义编译器YAML文件

要开始编写自定义编译器YAML文件,需要确定有关您的编译器的以下详细信息:

  • 您希望支持的语言,每种受支持的语言或语言变体都需要至少一个配置小节。
  • 编译器二进制文件名称,可以有不止一个。 一些工具链具有不同的 C 和 C++ 编译器二进制文件、不同的内存模型、不同的语言变体等,这些信息可以在工具链文档中找到,并且必须反映在您的自定义编译器 YAML 文件中。
  • 标准包含文件所在的目录,要标识这些目录,请阅读编译器的文档或直接浏览已安装的工具链文件夹树。
  • 预定义宏的列表,一些编译器可以报告预定义宏的列表,而其他编译器则不能。请参考您的编译器文档,以了解如何为您的编译器获取它们。

实用示例

我们通过为Small Device C Compiler (SDCC) 编写一个自定义编译器YAML文件来实践此过程, SDCC支持多种8位CPU架构,如STM8、Z80等。 该编译器是开源的,是多个MCU系列中唯一的免费编译器。 在此示例中,我们将为其Microchip PIC-16 变体(端口)编写一个 YAML 文件。

以下是我们需要了解的有关此编译器的详细信息:

  • 仅支持 C 语言。
  • 编译器二进制文件名称为 sdcc 或 sdcc.exe(在 Windows 中)。
  • -mpic16 选项对于 PIC16 架构支持是必需的,还应该使用 --use-non-free。
  • 要报告标题搜索路径列表,编译器应使用 --print-search-dirs 选项运行。
  • 要报告预定义的宏,编译器应使用 -E 和 -dM 选项和一个空白源文件运行。

我们将从创建一个测试项目开始,此最小项目包含一个C文件、YAML文件本身和一个构建系统文件,我们将使用Makefile。 如果要使用 C++,那么还应该添加另一个使用 C++ 编写的源文件。

首先,创建一个项目文件夹,并在里面创建一个空白 Makefile。

在CLion中打开该文件夹,然后在弹出的 Load Project(加载项目)对话框中点击 Cancel(取消)。

在 CLion 编辑器中打开 Makefile,并将最少内容添加到该 Makefile

clean:
all: main.c
sdcc -mpic16 --use-non-free -S main.c

该文件现在包含一个用于在不需要更多步骤的情况下将 main.c 编译成程序集的命令。

创建一个 main.c 文件,我们来创建一个经典的 “Hello, World”,并带有额外特定于 SDCC 的附加内容,即__code 关键字和预定义的宏 __SDCC_pic16。

#include <stdio.h>
int main() {
printf("Hello, World!n");
return 0;
}
int __code i = 0;
#ifndef __SDCC_pic16
# error "__SDCC_pic16 macro is expected to be defined"
#endif

接下来,我们编写一个自定义编译器配置存根:

  1. 创建一个名为 clion-custom-compiler-sdcc-pic16.yaml 的文件。
  2. 将 JSON 架构“Custom Compiler Definition”分配给该文件。

这样,CLion可以通过动态文件结构验证和输入提示为您提供帮助。 架构名称显示在 IDE 状态栏中,可以通过点击名称进行选择。

存根为:

compilers:
- description: SDCC for PIC-16
match-compiler-exe: "(.*/)?sdcc(.exe)?"

目前我们只通过名称进行匹配,它是一个匹配 Linux 和 Windows 编译器二进制文件名称的正则表达式,无论包含文件夹是什么。

下一步是在 CLion 中使用我们的自定义编译器配置,打开 Settings/Preferences | Build, Execution, Deployment | Toolchains | Custom Compiler(设置/偏好设置 | 构建、执行、部署 | 工具链 | 自定义编译器), 选中 Use custom compiler config(使用自定义编译器配置),并选择项目的 YAML 文件作为配置文件。

在 Tools(工具)菜单中选择 Makefile | Clean and Reload Makefile Project(Makefile | 清理并重新加载 Makefile 项目),如果一切正常,Build(构建)工具窗口将显示项目已成功加载。

如果项目未正确加载,则应仔细检查 YAML 文件中的 match-compiler-exe 语句。 记录值是一个正则表达式,它是该过程中最脆弱的部分。

现在我们来看看CLion是否真的适配了 SDCC,我们的项目是否按预期运行。

检查自定义编译器是否正常运行

在编辑器中打开 main.c, 此时看到一些错误没有关系。 转到 Help | Diagnostics Tools(帮助 | 诊断工具),选择 Show Compiler Info(显示编译器信息)。 这将打开一个诊断页面,其中包含正在编辑的文件的编译器信息。 在这里,您可以看到编译器种类(“Custom Defined Compiler”)和检测到的编译器描述(“SDCC for PIC-16”)。 这意味着 CLion 感知到了项目结构,但是代码分析器还没有所需的编译器数据,因此在 main.c 中显示了各种错误。

收集缺少的编译器信息

我们的 main.c 文件目前似乎已损坏, 找不到 stdio.h,printf 未定义,__code 修饰符错误,并且未定义文档中的预定义宏。

通过提供正确的编译器信息修正所有这些问题。

幸运的是,SDCC 可以打印标题位置和预定义的宏。 将以下各行添加到 Makefile 即可解决这个问题:

gather_info:
# List directories
sdcc -mpic16 --use-non-free --print-search-dirs
# Create a void C file
echo //void > void.c
# List predefined macros
sdcc -mpic16 --use-non-free -E -dM void.c

接下来,我们需要构建 gather_info 目标并查看输出。 首先,有一个标题搜索路径列表:

…
includedir:
C:Program FilesSDCCbin..includepic16
C:Program FilesSDCCbin..include
C:Program FilesSDCCbin..non-freeincludepic16
C:Program FilesSDCCbin..non-freeinclude
…

唯一的问题是这些路径是绝对路径,出于可移植性原因,我们将它们设为相对于编译器位置,并将它们作为 include-dirs 数组添加到编译器定义中。

接下来是预定义的宏,它们被打印在输出的最底部,可以通过 defines-text 将它们添加到 YAML 文件。

最后但同样重要的是,我们需要通过使用 match-args: -mpic16 和 match-language: C 语句使我们的编译器匹配得更具体一些,然后作为空定义添加 SDCC 语言扩展字。 完成后,最终的 YAML 文件将如下所示:

compilers:
- description: SDCC for PIC-16
match-compiler-exe: "(.*/)?sdcc(.exe)?"
match-args: -mpic16
match-language: C
include-dirs:
- ${compiler-exe-dir}/../include/pic16
- ${compiler-exe-dir}/../include
- ${compiler-exe-dir}/../non-free/include/pic16
- ${compiler-exe-dir}/../non-free/include
defines-text: "
#define __SDCC_USE_NON_FREE 1
#define __SDCC_PIC18F452 1
#define __18f452 1
#define __STACK_MODEL_SMALL 1
#define __SDCC_pic16 1
#define __SDCC_ALL_CALLEE_SAVES 1
#define __STDC_VERSION__ 201112L
#define __STDC_HOSTED__ 0
#define __SDCCCALL 0
#define __STDC_UTF_16__ 1
#define __SDCC_VERSION_MINOR 2
#define __STDC_ISO_10646__ 201409L
#define __SDCC_VERSION_PATCH 0
#define __SDCC_VERSION_MAJOR 4
#define __STDC_NO_VLA__ 1
#define __SDCC 4_2_0
#define __STDC_UTF_32__ 1
#define __STDC_NO_THREADS__ 1
#define __SDCC_CHAR_UNSIGNED 1
#define __STDC_NO_ATOMICS__ 1
#define __STDC__ 1
#define __SDCC_REVISION 13081
#define __STDC_NO_COMPLEX__ 1
#define __interrupt
#define __code
#define __at
"

现在,我们可以重新加载项目 Tools | Makefile | Reload Makefile Project(工具 | Makefile | 重新加载 Makefile 项目)并再次检查 main.c 文件。

错误已经消失,并且可以导航到 stdio.h。 Show Compiler Info(显示编译器信息)窗口显示了正确的信息,包括预定义的宏、语言功能和标题搜索路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Nginx基础篇】nginx的基本配置解析和应用场景

目录 一、最小配置 二、虚拟主机 一、最小配置 原始的配置文件 #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }…

【前后端分离项目】搭建前后端分离项目框架(vue前端)

创建项目文件夹 创建文件夹&#xff08;框架&#xff09;&#xff0c;可以在里面增加页面实现自己的需求。 在官网下载nodejs 官网地址&#xff1a;https://nodejs.org/en nodejs中自带了npm包&#xff0c;npm负责管理依赖&#xff0c;将nodejs下载完成后&#xff0c;即可使…

开关电源基础04:新型开关电源拓扑(1)-拓扑的改进

说在开头&#xff1a;关于互补原理 玻尔在挪威滑雪之余好好的思考了波粒问题&#xff0c;并逐渐完善了这个新想法&#xff1b;当他看到海森堡的论文时&#xff0c;自然而然地用这种想法去印证整个结论。他问海森堡&#xff1a;这种不确定性是从粒子的本性而来&#xff0c;还是…

软件架构:构建软件架构SOA

Web服务一种作为炙手可热的技术&#xff0c;应用到企业的IT系统和商业流程之中&#xff0c;并给企业带来直接的经济效益&#xff0c;一直以来得到了国内外企业管理者的推崇。而在近两年&#xff0c;伴随着企业需求的不断变化&#xff0c;一种被誉为Web服务的技术架构&#xff0…

【Flowable】Flowable任务分配和流程变量

1.任务分配 (1).固定分配 固定分配就是我们前面介绍的&#xff0c;在绘制流程图或者直接在流程文件中通过Assignee来指定的方式 (2).表达式分配 Flowable使用UEL进行表达式解析。UEL代表Unified Expression Language&#xff0c;是EE6规范的一部分.Flowable支持两种UEL表…

基于云平台的光伏监控系统是怎样的?

摘要&#xff1a;针对国内光伏发电监控系统的研究现状&#xff0c;文中提出了基于云平台的光伏发电监控体系。构建基于B/S架构的数据实时采集与推送&#xff0c;以SSH(strutsspringhibernate)作为Web开发框架&#xff0c;开发基于云平台的光伏发电远程监控系统。在平台部署过程…

开关电源基础04:新型开关电源拓扑(2)-新型电源拓扑

说在开头&#xff1a;关于量子理论 我们再来回顾下量子理论对双缝干涉的解释&#xff1a;当电子通过狭缝&#xff0c;假如我们采用任其自然的观测方式&#xff0c;让它不受干扰地在空间中传播&#xff0c;这时候电子的波动性就占据了上风&#xff0c;它于是以某种方式同时穿过…

农业机器人技术栈

结构光 https://www.youtube.com/watch?vmSsnf5tqXnA 局部路径规划算法 光流法 统计像素 分辨前景背景 绿色是我们比较关注的 unet做图像分割 运动比较剧烈的是前景 特征点匹配 大豆农田点云建图 农田路况复杂 光流计算量比较大&#xff0c;可以捕捉运动比较大的物体 分割检…

ChatGPT直接访问,Edge浏览器-免费ChatGPT保姆级教程

人工智能大浪潮已经来临&#xff0c;对于ChatGPT&#xff0c;我觉得任何一个玩互联网的人&#xff0c;都应该重视起来&#xff0c;用起来。但是国内使用需要解决科学上网、注册、收费等繁琐问题。 所以&#xff0c;今天这篇文章就来推荐一个插件&#xff0c;无需任何繁琐操作&…

日撸 Java 三百行day48

文章目录 说明day48 堆排序1.基本思路2.代码 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampledata day48 堆排序 1.基本…

【虚幻引擎】UE5 C++编译和打包失败的原因

一、出现The required library hostfxr.dll could not be found 错误 原因是缺少.NET Core3.1 解决办法一&#xff1a;可以去官网下载https://dotnet.microsoft.com/en-us/download/dotnet/3.1 解决方案二&#xff1a;打开Visual Studio Installer&#xff0c;选择单个组件&…

计算机Intel CPU体系结构分析

前段meldown漏洞事件的影响&#xff0c;那段时间也正好在读Paul的论文关于内存屏障的知识&#xff0c;其中有诸多细节想不通&#xff0c;便陷入无尽的煎熬和冥想中&#xff0c;看了**《计算机系统结构》、《深入理解计算机系统》、《大话处理器》**等经典书籍&#xff0c;也在g…

ISO9001是什么?ISO9000和ISO9001有何关系?

ISO 9000和ISO 9001是质量管理领域的两个重要标准。它们被用来确保组织能够提供符合客户要求的产品和服务&#xff0c;同时不断提高其业务效率和质量水平。本文将探讨ISO 9000和ISO 9001之间的关系&#xff0c;解释它们的区别以及为什么对企业非常重要。 什么是ISO9000和ISO90…

Windows安装Maven并配置环境

Windows下安装和配置Maven的步骤 介绍&#xff1a;步骤&#xff1a;步骤 1&#xff1a;下载Maven步骤 2&#xff1a;解压缩Maven分发包步骤 3&#xff1a;设置环境变量步骤 4&#xff1a;验证安装 结论&#xff1a; 介绍&#xff1a; Maven是一个非常流行的构建和项目管理工具…

Tunel技术是什么?

IPv4 用 32 位整数描述地址&#xff0c;最多只能支持 43 亿设备&#xff0c;显然是不够用的&#xff0c;这也被称作 IP 地址耗尽问题。为了解决这个问题&#xff0c;有一种可行的方法是拆分子网。拆分子网&#xff0c;会带来很多问题&#xff0c;比如说内外网数据交互&#xff…

银行业数字化运营体系(上):渠道触点矩阵建设

数字化运营体系是构建从获客、激活、留存、营收转化到转介的客户全生命周期的运营体系&#xff0c;推动线上产品和业务运营的数字化与智能化。 随着互联网技术的不断发展&#xff0c;移动设备已经成为人们日常生活中不可或缺的一部分&#xff0c;越来越多的用户在数字化渠道进行…

vmware 详细安装教程

一.VM是什么&#xff1f; VMware Workstation是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比&#xff0c;VMWare 采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统&#xff0c;在系统切换时需…

软考A计划-重点考点-专题六(数据库知识)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

数据结构实验的实验报告--B树

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 数据结构实验的实验报告–B树 环境及工具 环境&#xff1a;C 工具&#xff1a;AnyivewCL B 定义 一棵 m 阶 B 树(Balance Tree of order m), 或为空树,或满足下列的特性的 m 叉树&#xff1a;(本次实验采用链式存储结构) …

SSM框架学习-加载properties文件

1. 创建新的命名空间 将 xmlns"http://www.springframework.org/schema/beans" 复制修改为 xmlns:context"http://www.springframework.org/schema/context" 再添加进去 表示开辟一个新的命名空间&#xff0c;叫做context 在xsi:schemaLocation中&#xff…