ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C/C++开发神器CLion快速入门指南 - 如何使用任意编译器

2026/8/15 14:18:15 拓冰建站 浏览量
C/C++开发神器CLion快速入门指南 - 如何使用任意编译器 CLion是一款专为开发C及C所设计的跨平台IDE。它是以IntelliJ为基础设计的包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CMake编译系统从而提高开发人员的工作效率。作为一款IDECLion提供了许多功能来帮助开发者它可以显示文档弹出窗口、实时检测错误、建议修复等。 内部代码分析器始终在后台运行在您输入时分析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并将最少内容添加到该Makefileclean:all: main.csdcc -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 架构“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 ProjectMakefile | 清理并重新加载 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.hprintf 未定义__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显示编译器信息窗口显示了正确的信息包括预定义的宏、语言功能和标题搜索路径。这个最终的 YAML 文件可以在 GitHub 上找到。