翻譯|使用教程|編輯:龔雪|2023-05-09 10:39:09.603|閱讀 107 次
概述:本文將為大家講解關于在 CLion 中使用任意編譯器的快速指南,歡迎下載最新版IDE體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
CLion是一款專為開發C及C++所設計的跨平臺IDE,它是以IntelliJ為基礎設計的,包含了許多智能功能來提高開發人員的生產力。這種強大的IDE幫助開發人員在Linux、OS X和Windows上來開發C/C++,同時它還使用智能編輯器來提高代碼質量、自動代碼重構并且深度整合CMake編譯系統,從而提高開發人員的工作效率。
作為一款IDE,CLion提供了許多功能來幫助開發者,它可以顯示文檔彈出窗口、實時檢測錯誤、建議修復等。內部代碼分析器始終在后臺運行,在您輸入時分析 C 和 C++ 代碼。 對于自動分析器來說,C 和 C++ 是具有挑戰性的語言,因為需要特定于編譯器的數據才能正確解析代碼,引擎需要知道標題搜索路徑、預定義的宏定義和其他一些詳細信息。
對于一組預定義的已知編譯器,CLion會使用特殊選項運行項目的編譯器,并在解析項目時收集所需信息。 當然這只適用于有限數量的編譯器,如GCC、Clang、MSVC、IAR及其衍生工具,如果某個項目使用特定的自定義編譯器、很少使用的編譯器或我們無權訪問的專有編譯器來正確集成,則CLion無法通過其標準過程進行使用。 在這種情況下,您可以選擇使用自定義編譯器功能。
要在CLion中使用自定義編譯器,您需要一個包含必要編譯器數據的YAML文件。 此類文件應包含一個或多個小節,每個小節描述一個特定的編譯器或編譯器變體,每個小節應有一個描述、一個或多個匹配記錄,以及多個信息記錄。
當CLion解析項目并遇到針對項目文件的編譯器時,CLion會逐節掃描,并檢查編譯器是否與記錄匹配。 匹配會使用一個或多個匹配記錄來完成,可用的匹配記錄包括:
在所有匹配項成功解析之后,就會選取小節信息記錄,并跳過YAML文件的其余部分。 編譯器數據獲取自信息記錄,然后直接傳遞給 CLion 的代碼分析器;也就是說,在編譯器試運行期間不收集數據。
如果這些小節都沒有為IDE提供將記錄與特定編譯器積極匹配的信息,它會嘗試以通常的方式(即通過猜測編譯器的類型并運行編譯器)來收集編譯器數據。
要開始編寫自定義編譯器YAML文件,需要確定有關您的編譯器的以下詳細信息:
我們通過為Small Device C Compiler (SDCC) 編寫一個自定義編譯器YAML文件來實踐此過程, SDCC支持多種8位CPU架構,如STM8、Z80等。 該編譯器是開源的,是多個MCU系列中唯一的免費編譯器。 在此示例中,我們將為其Microchip PIC-16 變體(端口)編寫一個 YAML 文件。
以下是我們需要了解的有關此編譯器的詳細信息:
我們將從創建一個測試項目開始,此最小項目包含一個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
接下來,我們編寫一個自定義編譯器配置存根:
這樣,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(顯示編譯器信息)窗口顯示了正確的信息,包括預定義的宏、語言功能和標題搜索路徑。
Jetbrains技術交流群(QQ):786598704 歡迎一起進群討論
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網