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

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

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

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

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

  • match-compiler-exe是一个正则表达式,并根据它检查编译器名称。一个很好的独立于平台的例子是”(.*/)dcc(.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: "(.*/)dcc(.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 FilesSDCCbin..includepic16C:Program FilesSDCCbin..includeC:Program FilesSDCCbin..non-freeincludepic16C:Program FilesSDCCbin..non-freeinclude…

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

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

compilers:  - description: SDCC for PIC-16    match-compiler-exe: "(.*/)dcc(.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技术交流

标签:

来源:慧都

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年8月6日
下一篇 2022年8月6日

相关推荐

发表回复

登录后才能评论