翻譯|使用教程|編輯:龔雪|2023-05-09 10:39:09.603|閱讀 116 次
概述:本文將為大家講解關(guān)于在 CLion 中使用任意編譯器的快速指南,歡迎下載最新版IDE體驗(yàn)!
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
CLion是一款專為開發(fā)C及C++所設(shè)計(jì)的跨平臺(tái)IDE,它是以IntelliJ為基礎(chǔ)設(shè)計(jì)的,包含了許多智能功能來提高開發(fā)人員的生產(chǎn)力。這種強(qiáng)大的IDE幫助開發(fā)人員在Linux、OS X和Windows上來開發(fā)C/C++,同時(shí)它還使用智能編輯器來提高代碼質(zhì)量、自動(dòng)代碼重構(gòu)并且深度整合CMake編譯系統(tǒng),從而提高開發(fā)人員的工作效率。
作為一款I(lǐng)DE,CLion提供了許多功能來幫助開發(fā)者,它可以顯示文檔彈出窗口、實(shí)時(shí)檢測(cè)錯(cuò)誤、建議修復(fù)等。內(nèi)部代碼分析器始終在后臺(tái)運(yùn)行,在您輸入時(shí)分析 C 和 C++ 代碼。 對(duì)于自動(dòng)分析器來說,C 和 C++ 是具有挑戰(zhàn)性的語言,因?yàn)樾枰囟ㄓ诰幾g器的數(shù)據(jù)才能正確解析代碼,引擎需要知道標(biāo)題搜索路徑、預(yù)定義的宏定義和其他一些詳細(xì)信息。
對(duì)于一組預(yù)定義的已知編譯器,CLion會(huì)使用特殊選項(xiàng)運(yùn)行項(xiàng)目的編譯器,并在解析項(xiàng)目時(shí)收集所需信息。 當(dāng)然這只適用于有限數(shù)量的編譯器,如GCC、Clang、MSVC、IAR及其衍生工具,如果某個(gè)項(xiàng)目使用特定的自定義編譯器、很少使用的編譯器或我們無權(quán)訪問的專有編譯器來正確集成,則CLion無法通過其標(biāo)準(zhǔn)過程進(jìn)行使用。 在這種情況下,您可以選擇使用自定義編譯器功能。
要在CLion中使用自定義編譯器,您需要一個(gè)包含必要編譯器數(shù)據(jù)的YAML文件。 此類文件應(yīng)包含一個(gè)或多個(gè)小節(jié),每個(gè)小節(jié)描述一個(gè)特定的編譯器或編譯器變體,每個(gè)小節(jié)應(yīng)有一個(gè)描述、一個(gè)或多個(gè)匹配記錄,以及多個(gè)信息記錄。
當(dāng)CLion解析項(xiàng)目并遇到針對(duì)項(xiàng)目文件的編譯器時(shí),CLion會(huì)逐節(jié)掃描,并檢查編譯器是否與記錄匹配。 匹配會(huì)使用一個(gè)或多個(gè)匹配記錄來完成,可用的匹配記錄包括:
在所有匹配項(xiàng)成功解析之后,就會(huì)選取小節(jié)信息記錄,并跳過YAML文件的其余部分。 編譯器數(shù)據(jù)獲取自信息記錄,然后直接傳遞給 CLion 的代碼分析器;也就是說,在編譯器試運(yùn)行期間不收集數(shù)據(jù)。
如果這些小節(jié)都沒有為IDE提供將記錄與特定編譯器積極匹配的信息,它會(huì)嘗試以通常的方式(即通過猜測(cè)編譯器的類型并運(yùn)行編譯器)來收集編譯器數(shù)據(jù)。
要開始編寫自定義編譯器YAML文件,需要確定有關(guān)您的編譯器的以下詳細(xì)信息:
我們通過為Small Device C Compiler (SDCC) 編寫一個(gè)自定義編譯器YAML文件來實(shí)踐此過程, SDCC支持多種8位CPU架構(gòu),如STM8、Z80等。 該編譯器是開源的,是多個(gè)MCU系列中唯一的免費(fèi)編譯器。 在此示例中,我們將為其Microchip PIC-16 變體(端口)編寫一個(gè) YAML 文件。
以下是我們需要了解的有關(guān)此編譯器的詳細(xì)信息:
我們將從創(chuàng)建一個(gè)測(cè)試項(xiàng)目開始,此最小項(xiàng)目包含一個(gè)C文件、YAML文件本身和一個(gè)構(gòu)建系統(tǒng)文件,我們將使用Makefile。 如果要使用 C++,那么還應(yīng)該添加另一個(gè)使用 C++ 編寫的源文件。
首先,創(chuàng)建一個(gè)項(xiàng)目文件夾,并在里面創(chuàng)建一個(gè)空白 Makefile。
在CLion中打開該文件夾,然后在彈出的 Load Project(加載項(xiàng)目)對(duì)話框中點(diǎn)擊 Cancel(取消)。
在 CLion 編輯器中打開 Makefile,并將最少內(nèi)容添加到該 Makefile:
clean: all: main.c sdcc -mpic16 --use-non-free -S main.c
該文件現(xiàn)在包含一個(gè)用于在不需要更多步驟的情況下將 main.c 編譯成程序集的命令。
創(chuàng)建一個(gè) main.c 文件,我們來創(chuàng)建一個(gè)經(jīng)典的 “Hello, World”,并帶有額外特定于 SDCC 的附加內(nèi)容,即__code 關(guān)鍵字和預(yù)定義的宏 __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
接下來,我們編寫一個(gè)自定義編譯器配置存根:
這樣,CLion可以通過動(dòng)態(tài)文件結(jié)構(gòu)驗(yàn)證和輸入提示為您提供幫助。 架構(gòu)名稱顯示在 IDE 狀態(tài)欄中,可以通過點(diǎn)擊名稱進(jìn)行選擇。
存根為:
compilers: - description: SDCC for PIC-16 match-compiler-exe: "(.*/)?sdcc(.exe)?"
目前我們只通過名稱進(jìn)行匹配,它是一個(gè)匹配 Linux 和 Windows 編譯器二進(jìn)制文件名稱的正則表達(dá)式,無論包含文件夾是什么。
下一步是在 CLion 中使用我們的自定義編譯器配置,打開 Settings/Preferences | Build, Execution, Deployment | Toolchains | Custom Compiler(設(shè)置/偏好設(shè)置 | 構(gòu)建、執(zhí)行、部署 | 工具鏈 | 自定義編譯器), 選中 Use custom compiler config(使用自定義編譯器配置),并選擇項(xiàng)目的 YAML 文件作為配置文件。
在 Tools(工具)菜單中選擇 Makefile | Clean and Reload Makefile Project(Makefile | 清理并重新加載 Makefile 項(xiàng)目),如果一切正常,Build(構(gòu)建)工具窗口將顯示項(xiàng)目已成功加載。
如果項(xiàng)目未正確加載,則應(yīng)仔細(xì)檢查 YAML 文件中的 match-compiler-exe 語句。 記錄值是一個(gè)正則表達(dá)式,它是該過程中最脆弱的部分。
現(xiàn)在我們來看看CLion是否真的適配了 SDCC,我們的項(xiàng)目是否按預(yù)期運(yùn)行。
在編輯器中打開 main.c, 此時(shí)看到一些錯(cuò)誤沒有關(guān)系。 轉(zhuǎn)到 Help | Diagnostics Tools(幫助 | 診斷工具),選擇 Show Compiler Info(顯示編譯器信息)。 這將打開一個(gè)診斷頁面,其中包含正在編輯的文件的編譯器信息。 在這里,您可以看到編譯器種類(“Custom Defined Compiler”)和檢測(cè)到的編譯器描述(“SDCC for PIC-16”)。 這意味著 CLion 感知到了項(xiàng)目結(jié)構(gòu),但是代碼分析器還沒有所需的編譯器數(shù)據(jù),因此在 main.c 中顯示了各種錯(cuò)誤。
我們的 main.c 文件目前似乎已損壞, 找不到 stdio.h,printf 未定義,__code 修飾符錯(cuò)誤,并且未定義文檔中的預(yù)定義宏。
通過提供正確的編譯器信息修正所有這些問題。
幸運(yùn)的是,SDCC 可以打印標(biāo)題位置和預(yù)定義的宏。 將以下各行添加到 Makefile 即可解決這個(gè)問題:
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
接下來,我們需要構(gòu)建 gather_info 目標(biāo)并查看輸出。 首先,有一個(gè)標(biāo)題搜索路徑列表:
… includedir: C:Program FilesSDCCbin..includepic16 C:Program FilesSDCCbin..include C:Program FilesSDCCbin..non-freeincludepic16 C:Program FilesSDCCbin..non-freeinclude …
唯一的問題是這些路徑是絕對(duì)路徑,出于可移植性原因,我們將它們?cè)O(shè)為相對(duì)于編譯器位置,并將它們作為 include-dirs 數(shù)組添加到編譯器定義中。
接下來是預(yù)定義的宏,它們被打印在輸出的最底部,可以通過 defines-text 將它們添加到 YAML 文件。
最后但同樣重要的是,我們需要通過使用 match-args: -mpic16 和 match-language: C 語句使我們的編譯器匹配得更具體一些,然后作為空定義添加 SDCC 語言擴(kuò)展字。 完成后,最終的 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 "
現(xiàn)在,我們可以重新加載項(xiàng)目 Tools | Makefile | Reload Makefile Project(工具 | Makefile | 重新加載 Makefile 項(xiàng)目)并再次檢查 main.c 文件。
錯(cuò)誤已經(jīng)消失,并且可以導(dǎo)航到 stdio.h。 Show Compiler Info(顯示編譯器信息)窗口顯示了正確的信息,包括預(yù)定義的宏、語言功能和標(biāo)題搜索路徑。
Jetbrains技術(shù)交流群(QQ):786598704 歡迎一起進(jìn)群討論
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:慧都網(wǎng)