提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
前言
提示:本節(jié)講解了為什么需要配置這樣一套開發(fā)環(huán)境,可以跳過
本文力求通俗、詳細的講解 C程序開發(fā) 環(huán)境配置。深入淺出的講解以及大量的圖片對小白更友好。看完本文你將得到一套 vscode + gcc + gdb + CMake + clangd 的 c/c++ 開發(fā)環(huán)境(支持 嵌入式開發(fā) )。
為什么需要一套這樣的開發(fā)環(huán)境?
我們在 “宇宙級IDE” Visual Studio 中點點鼠標就能編譯c代碼,足夠完成老師的作業(yè)。沒錯,這種簡單好用,具有代碼補全,可以一鍵編譯、調(diào)試的開發(fā)軟件就叫 集成開發(fā)環(huán)境 或 IDE。
很可惜,vscode并不是一個ide,它只是一個代碼編輯工具,類似電腦里的記事本。為了實現(xiàn)代碼補全、編譯、調(diào)試的功能,我們需要在vscode里安裝幾個插件。
為什么不直接用ide呢?
當然可以,ide的簡便能讓新手更快入門編程。但是使用ide可能遇到以下幾個困境:
- github上下載的源碼只有一堆.c/.h文件,不是vs工程,如何在源碼上進行構建開發(fā)?
- 發(fā)布開源工程,要告訴別人怎么使用我的庫好麻煩,如果編譯等過程可以用命令行寫成腳本,整個過程自動完成就好了。
- 公司的項目使用CMake進行組織,只能適應項目。
- 面試的時候不會CMake、gcc、gdb,還沒進公司就結束嘞。
1. Vscode
vscode的安裝非常簡單,網(wǎng)上有許多教程,挑選一個近期的教程就行。這里給出一個教程:
鏈接: VSCode安裝配置使用教程(最新版超詳細保姆級含插件)一文就夠了
【你要做的】
- 安裝vscode
- (可選)安裝chinese插件,重啟 vscode 獲得中文界面。英文界面好處是報錯的時候顯示英文,更方便查詢錯誤代碼。
此時你已經(jīng)能通過vscode編寫代碼,但僅僅只能編寫、保存。想要運行代碼看到效果,需要 編譯器 將代碼編譯為 可執(zhí)行文件
2. GCC編譯器
2.1 前提知識
GCC 是 GNU 開發(fā)的C語言編譯器,開發(fā)C語言必不可少的工具。而 windows 平臺下的 GCC 叫 MinGW,因此我們需要安裝這個叫 MinGW 的軟件。
2.2 安裝與使用
同樣參考近期教程就行,這里給出推薦:
鏈接: 下載安裝MinGW-w64詳細步驟
【安裝步驟】
- 進入官網(wǎng)下載MinGW
- 安裝(解壓)
- 添加路徑到環(huán)境變量
無論參考哪個教程,最后能通過以下測試就代表安裝成功:
按 win + r 打開運行窗口,輸入 cmd 回車進入命令行,輸入 gcc -v
現(xiàn)在我們可以使用 vscdoe 編輯代碼 , 在命令行使用 MinGW 編譯代碼了。
【編譯步驟】
- 在 vscode 中點擊 菜單欄-終端-新建終端,在底部得到一個命令行窗口,這個終端等同于剛才的黑框命令行
- 在左側欄空白處右鍵 - 新建文件 輸入文件名 main.c
- 輸入文件內(nèi)容 (可以在下面復制)
- 輸入命令
gcc -o main.exe main.c
,這個命令的意思是調(diào)用 gcc 編譯器,將 main.c 編譯成可執(zhí)行文件 main.exe
(不熟悉 gcc 命令也沒關系,照做就行,先搭建環(huán)境再學習 gcc 的使用) - 可以觀察到在 main.c 的同級目錄里,已經(jīng)產(chǎn)生了一個 main.exe 文件
- 輸入命令
.\main.exe
運行程序,程序的輸出會顯示在這個終端里 - 得到程序的輸出,程序正常運行
#include <stdio.h>
int main()
{
printf("hello world!\r\n");
return 0;
}
OK,到目前為止,我們已經(jīng)可以編寫代碼、編譯程序,能夠完成簡單的開發(fā)工作了。
3. GDB
3.1 前提知識
gcc 編譯的程序可以使用 gdb 調(diào)試 (如果你用 clang 編譯程序則可以用 lldb 調(diào)試)
3.2 安裝與使用
gcc 與 gdb 是一套的開發(fā)工具,在安裝 MinGW 時我們已經(jīng)同時獲得了二者。
【調(diào)試步驟】
- 刪除之前生成的 main.exe ,輸入命令
gcc -o main.exe main.c -g
重新生成 main.exe 。加上-g 參數(shù)讓生成的程序可以調(diào)試。 - 輸入命令
gdb main.exe
調(diào)用 gdb 進行調(diào)試 - 根據(jù)提示信息,輸入 c 并回車繼續(xù)調(diào)試
- 輸入
lsit 1
查看當前“行號”前后10行的代碼 - 輸入
b 5
,在 第5行 設置一個斷點 - 輸入
r
全速運行程序,根據(jù) gdb 的輸出可以知道命中了剛才設置的斷點,下一條要執(zhí)行的語句是第5行 - 輸入
n
執(zhí)行下一條語句,觀察 gdb 的輸出,正常顯示了 pritntf() 的內(nèi)容以及下一條要執(zhí)行的語句 - 輸入
r
繼續(xù)全速運行,提示程序執(zhí)行完畢,是否要繼續(xù)從頭執(zhí)行 - 輸入
n
結束程序運行 - 輸入
quit
退出 gdb 調(diào)試
至此,你已經(jīng)體驗過了一次緊張刺激的 gdb 調(diào)試。
3.3 圖形界面調(diào)試
gdb 提供了調(diào)試程序的服務,vscode 里的 c/c++ 插件則可以為這個調(diào)試過程提供圖形界面。
【安裝步驟】
- 在 vscode 左側欄中點擊 拓展 按鈕,打開插件市場
- 搜索
c/c++
點擊第一個結果 - 點擊 安裝 ,可以從插件的介紹看出,該插件提供 調(diào)試(debugging)、語法補全等服務(code browsing)
【配置launch.json步驟】
- 點擊左側欄中的 調(diào)試 按鈕
- 點擊 “創(chuàng)建launch.json文件”
- 選擇目錄,不一定出現(xiàn)這個步驟,這是選擇創(chuàng)建 launch.json 文件的目錄
- 選擇帶 gdb 字樣的選項,這是選擇調(diào)試器,我們用 gcc 編譯的程序,自然用 gdb 調(diào)試程序
- 步驟4-7 最終目的是在 main.c 所在目錄生成一個 .vscode 文件夾 里面有 launch.json 文件。這個文件會告訴 c/c++ 插件,要去哪里找到 gdb 程序、要用 gdb 去調(diào)試哪個 .exe 文件?,F(xiàn)在我們來填寫 launch.json 文件。
(步驟4-7也可以不做,我們自己手動創(chuàng)建 .vscode 文件夾 以及 launch.json 文件,效果一樣,反正文件內(nèi)容接下來也要全部重寫) - 重寫 launch.json 文件 (可以在下面復制)
“name”, “type”, “request” 是必須有的, “type”: “cppdbg” 代表使用 c/c++ 插件進行調(diào)試
“program” 最重要,表示需要調(diào)試程序的路徑,即 main.exe 的路徑,“cwd” 用于查找依賴項和其他文件的當前工作目錄
“MIMode”, “miDebuggerPath” 提供了gdb的路徑 (這個路徑要根據(jù)你自己安裝 MinGW 的路徑填寫)
(這里只列出一份非常簡單的 launch.json ,更詳細的寫法推薦查看 vscode 官方的文檔)
鏈接: 在Visual Studio Code中調(diào)試
- 點擊 “調(diào)試” 按鈕
- 打一個斷點
- 點擊按鈕開始調(diào)試,這個按鈕的名稱對應 launch.json 中的 “name”
- 在上方的調(diào)試欄有全速運行、單步運行等,還可以將變量添加到監(jiān)視區(qū)查看值,之后的調(diào)試技巧可以查找 “ vscode 調(diào)試教程 ” 了解
{
"version": "0.2.0",
"configurations": [
{
"name": "C++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/main.exe",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "D:\\MinGw64\\bin\\gdb.exe" // 注意修改成你自己安裝MinGWd的路徑
}
]
}
OK,到目前為止,我們已經(jīng)可以編寫代碼、編譯程序、調(diào)試程序了,接下來嘗試用 CMake 構建工程吧!
4. CMake
4.1 前提知識
每次編譯要寫一長串gcc命令非常麻煩,而且隨著工程變大,使用gcc命令非常復雜且容易出錯。更簡單的方法是使用 Makefile 。
Makefile 文件里有我們提前精心設計好的編譯命令,之后 make 工具會去讀取 Makefile 并一條條執(zhí)行里面的指令。代替我們手敲指令。
這個 make 工具也在 MinGW 里提供了,不需要另外安裝。
【Makefile使用步驟】
- 新建Makefile文件,輸入圖中的內(nèi)容(可以在下面復制),主要內(nèi)容是 第2行 和 第5行 的兩個命令
- 在命令行執(zhí)行
mingw32-make.exe
(linux執(zhí)行make
),這個 make 程序會在當前命令行路徑下找到 Makefile 文件,執(zhí)行Makefile里預設好的命令。這里運行了 第2行 的命令 “gcc -o main main.c” - 自動執(zhí)行 gcc -o main main.c 指令,生成了main.exe
- 再次執(zhí)行
mingw32-make.exe
,提示說 mingw32-make: ‘main.exe’ is up to date. 意思是已經(jīng)生成了 main.exe 且 main.c 也沒修改過,就不再重新生成 main.exe 了。這個功能的意義在于:假設你有 1.c 2.c 3.c 三個文件,你只修改了 3.c 之后進行編譯,由于 1.c 2.c 沒有修改則不會參與編譯,僅重新編譯 3.c , 而不是編譯所有文件。這會大大縮短編譯時間。 - 執(zhí)行
mingw32-make.exe clean
命令,自動執(zhí)行 Makefile 里的 第5行 指令 “rm main.exe” - 自動執(zhí)行 rm main.exe 清除了main.exe
main.exe : main.c
gcc -o main main.c
clean:
rm main.exe
Makefile 很強大,但也有些問題。為龐大的工程編寫 Makefile 比較麻煩。且不同平臺(如win和Linux)的編譯指令不一樣,如果你發(fā)布的代碼想要運行在不同平臺,必然要為不同平臺各自寫一份 Makefile 。
這時候你就需要 CMake了,CMake 使用一個 CMakeLists.txt 文件記錄工程結構(比如有哪些.c文件,頭文件路徑在哪之類的),之后能為每個平臺生成各自的 Makefile 。也就是說我們只需要關注代碼怎么寫,具體如何用命令行來編譯交給 Cmake 就行。很多開源項目都在使用CMake構建工程。下面介紹 Vscode 平臺下 CMake 的安裝與使用。
4.2 安裝與使用
【你要做的】
- 點擊vscode左側的“拓展按鈕”
- 在搜索欄查找
CMake
和CMake Tools
,安裝這兩個插件。安裝完畢可能需要重啟 vscode - 新建
CMakeLists.txt
文件 (最好注意大小寫),這個文件是給 CMake 用的,每個使用 CMake 構建的工程都有這個文件 - 輸入圖中內(nèi)容 (可以在下面復制) ,重點是 第8行 ,表示使用 main.c 生成 main.exe
- 在源碼目錄下執(zhí)行
mkdir .\build\
,在該目錄下創(chuàng)建一個 build 文件夾 - 執(zhí)行
cd .\build\
,進入剛剛創(chuàng)建的 build 文件夾 - 執(zhí)行
cmake .. -G "MinGW Makefiles"
,這個命令是使用 CMake 插件來生成 Makefile
a . . 表示在 build 的上一層目錄 (即源碼 main.c 所在目錄) 尋找 CMakeLists.txt
b -G “MinGW Makefiles” 是因為 CMake 默認使用微軟的 MSVC 作為編譯器,想使用 MinGW 編譯器可以通過 -G 參數(shù)來進行指定,只有第一次構建項目時需要指定。
c 步驟 5-7 稱為使用 CMake 進行 外部構建 ,執(zhí)行完后在 build 文件夾中生成了Makefile 。你還可以發(fā)現(xiàn)一個 compile_commands.json 文件,這是神奇妙妙文件,作用之后再說。 - 執(zhí)行
mingw32-make.exe
,步驟7 生成了 Makefile ,接下來當然就是執(zhí)行 make 編生成 main.exe 文件 - 執(zhí)行
./main.exe
運行程序,程序正常執(zhí)行輸出 hello world!
cmake_minimum_required(VERSION 3.0)
set(CMAKE_EXPORT_COMPILE_COMMANDS True) # 讓CMake生成compile_commands.json文件
set(CMAKE_BUILD_TYPE "Debug") # 設置編譯時使用 -g 參數(shù)生成可供調(diào)試的程序,不設置則生成的main.exe無法調(diào)試
project(HELLOWORLD)
add_executable(main main.c)
4.3 圖形界面CMake
CMake 插件還提供了更簡單的操作方法,讓你點點鼠標就能完成工程構建,參考這個教程:
鏈接: VSCode與CMake搭配使用之基本配置
目前為止我們實現(xiàn)了代碼的編輯、編譯、調(diào)試、用 CMake 構建工程。遇到新工程只需要重復 步驟3-9 就行。具體 CMakeLists.txt 文件的編寫方法屬于 CMake 語法,本文不重點介紹。
5. Clangd
5.1 前提知識
clangd 是做什么用的?
clangd 是語言服務器,提供代碼補全、語法高亮、代碼格式化、跳轉到定義等非常實用的功能。在閱讀源碼時如果不能直接跳轉到定義將會寸步難行。所以為了愉快的開發(fā)C程序,clangd 幾乎是必不可少的。
(雖然之前安裝的 C/C++ 插件也有語言服務功能,但我們將關閉它的語言功能,僅使用調(diào)試功能)
為什么不用微軟提供的 C/C++ 插件?
根據(jù)筆者的經(jīng)驗,目前想要在 vscode 上開發(fā)嵌入式代碼,提供語法服務,clangd 是唯一的選擇。
為什么 clangd 可以在嵌入式開發(fā)中使用?
window 平臺下 使用 printf() 函數(shù)時,編譯器 MinGW 會在它的庫文件里找到函數(shù)實現(xiàn)并調(diào)用。同樣,用戶在 Linux 平臺下調(diào)用函數(shù)時,交叉編譯工具鏈也會去內(nèi)核源碼中找到函數(shù)實現(xiàn)并調(diào)用。但是 windows 平臺下沒法運行 Linux 的交叉編譯工具,在看到 printf() 時不知道去哪找這個函數(shù)的實現(xiàn)。
但是在編譯程序時,代碼里每個函數(shù)的具體實現(xiàn)在哪個 .c 文件是確定的,這是在 Makefile 里寫好了的。跟蹤 Makefile 的編譯過程可以知道各個函數(shù)的調(diào)用關系。在 4.2 步驟7 中生成的 compile_commands.json 就是保存了各個函數(shù)調(diào)用關系的文件。Clangd 讀取這個文件,從而提供代碼補全、跳轉定義等語法服務。
5.2 安裝與使用
【你要做的】
- 查找并安裝 clangd 插件
- a 安裝完 clangd 后,右下角出現(xiàn)彈窗,意思是 clangd 和 c\c++ 的語法服務功能重復了,我們 選擇禁用 c\c++
(如果 2.a 沒有彈出彈窗,需要執(zhí)行 2.b - 2.e ,否則不用執(zhí)行)
b 如果沒有在彈窗中禁用 c\c++ ,那么點擊齒輪按鈕
c 點擊設置,打開設置頁
d 點擊右上角按鈕,打開 setting.json 文件,修改文件內(nèi)容就是在修改 vscode 的設置
e 在 setting.json 的圖示位置追加一行代碼 (下文給出) ,意思是告訴 vscode 不要使用 c\c++ 的語法服務功能 - 同 4.2 的 步驟3-4 ,新建CMakeLists.txt文件,輸入內(nèi)容。其中 第3行 的含義是設置生成 compile_commands.json
- 同 4.2 的 步驟5-7 ,運行CMake,生成 compile_commands.json
- 檢查一下 build 文件夾下確實有我們需要的文件
- 隨便點開一個 .c 文件,這會觸發(fā) clangd 開始工作
a clangd 會解析 compile_commands.json ,生成一個.cache 文件夾,里面是 clangd 建立的索引
b clangd 表示已經(jīng)建立索引完畢 (idle) ,可以正常使用語言服務了,在大型工程里需要等待一段時間建立索引
c 已經(jīng)可以使用語法補全功能了
"C_Cpp.intelliSenseEngine": "disabled"
目前我們已經(jīng)完全實現(xiàn)了目標,相信你已經(jīng)能獨立開發(fā) Linux 內(nèi)核了。文章來源:http://www.zghlxwxcb.cn/news/detail-829348.html
原創(chuàng)文章不易,請動動你的小拇指,點個免費的贊吧,阿里嘎多!文章來源地址http://www.zghlxwxcb.cn/news/detail-829348.html
到了這里,關于[ vscode + clangd + gcc + gdb + cmake] 一文帶你構造C/C++開發(fā)環(huán)境 #支持嵌入式開發(fā) #超詳細 #小白的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!