彩票走势图

在 C/C++开发工具CLion 中使用任意编译器的快速指南

翻译|使用教程|编辑:董玉霞|2022-09-09 11:43:27.117|阅读 657 次

概述:CLion是一个 IDE,它提供了许多功能来帮助开发人员。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

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

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

要在 CLion 中使用自定义编译器,您需要一个包含必要编译器数据的 YAML 文件。这样的文件应该包含一个或多个部分,每个部分描述一个特定的编译器或编译器变体。每个部分都应该有一个描述、一个或多个匹配记录和几个信息记录。

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

  • match-compiler-exe是一个正则表达式,并根据它检查编译器名称。一个很好的独立于平台的例子是"(.*/)?sdcc(.exe)?".
  • match-source也是一个正则表达式,它与要编译的源文件的名称相匹配。通常它".*\\.c"用于 C 和".*\\.cpp"C++。
  • 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 文件中。
  • 标准包含文件所在的目录。要识别这些目录,请阅读编译器的文档或简单地浏览已安装的工具链文件夹树。
  • 预定义宏的列表。一些编译器可以报告其预定义宏的列表,而另一些则不能。请参阅编译器的文档以了解如何为您的编译器获取它们。
实际例子

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

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

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

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

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

在 CLion 中打开该文件夹,然后在弹出的“加载项目”对话框中单击“取消”。

在 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


现在我们编写一个自定义编译器配置存根:

创建一个名为clion-custom-compiler-sdcc-pic16.yaml 的文件。

将 JSON 模式“自定义编译器定义”分配给文件。

自定义编译器方案已验证这样,CLion 可以帮助您进行即时文件结构验证和输入提示。架构名称显示在 IDE 状态栏中,可以通过单击名称来选择。

C开发工具CLion。

存根是:

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


目前,我们仅按名称匹配。它是一个匹配 Linux 和 Windows 编译器二进制名称的正则表达式,与包含的文件夹无关。

下一步是在 CLion 中使用我们的自定义编译器配置。打开设置/首选项 | 构建、执行、部署 | 工具链 | 自定义编译器。选中Use custom compiler config并选择项目的 YAML 文件作为配置文件。

C开发工具CLion。

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

C开发工具CLion。

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

现在让我们检查一下 CLion 是否确实已经接受了 SDCC,并且我们的项目按预期工作。

检查自定义编译器是否工作

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

C开发工具CLion。

收集缺失的编译器信息

main.c文件目前看起来已损坏。未找到stdio.hprintf ,未定义,__code修饰符错误,并且未定义文档中的预定义宏。

C开发工具CLion。


让我们通过提供正确的编译器信息来解决所有这些问题。


幸运的是,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 Files\SDCC\bin\..\include\pic16
C:\Program Files\SDCC\bin\..\include
C:\Program Files\SDCC\bin\..\non-free\include\pic16
C:\Program Files\SDCC\bin\..\non-free\include
…


唯一的问题是这些路径是绝对路径。出于可移植性的原因,让我们将它们相对于编译器位置,并将它们作为include-dirs数组添加到编译器定义中。 接下来是预定义的宏。它们打印在输出的最底部。它们可以通过定义文本添加到 YAML 文件中。

match-args: -mpic16最后但同样重要的是,我们需要通过使用and语句使我们的编译器匹配更具体一些 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)并再次检查main.c文件。

C开发工具CLion。

错误消失了,可以导航到stdio.h。Show Compiler Info窗口显示正确的信息——包括预定义的宏、语言特性和标题搜索路径。

这个最终的 YAML 文件可以在GitHub上找到。

以上就是关于在 CLion 中使用任意编译器的快速指南,更多关于CLion使用教程的内容可进入官网查看。

CLion| 下载试用

CLion是一款专为开发C及C++所设计的跨平台IDE。它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员的生产力。

CLion技术交流QQ群:786598704      欢迎进群一起讨论


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
相关产品
CLion

CLion是一款专为开发C及C++所设计的跨平台IDE。

PyCharm

PyCharm是一种提高Python语言开发效率的IDE

IntelliJ IDEA

IntelliJ在业界被公认为优秀的Java开发平台之一,在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面表现突出,并支持基于Android平台的程序开发。

Space

是一个针对软件项目和团队的一体化解决方案。

扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP