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