對于多檔案的C專案,大部分人會選擇使用'cmake'來管理編譯程序,對于精力充沛的朋友來說,也可以學習一下使用這個強大的工具,
但我覺得如果只想在VS Code里寫幾行代碼應對當前需求,沒必要再去學習一個完全陌生的東西,也沒必要把配置程序復雜化,
所以我接下來講的配置多檔案編譯的程序并不涉及'cmake',
目錄模式
我將這種配置方式稱為“目錄模式”,跟Eclipse類似,每個目錄作為一個專案,
在上一篇中我們講了如何進行單檔案的編譯和除錯,其中使用了VS Code提供的變數,以定位到當前檔案,
同樣地,我們只需要再使用VS Code提供的變數,定位到當前目錄,再利用Linux Shell的通配符,即可匹配到當前目錄下所有要編譯的源檔案,
gcc本身是支持多檔案編譯的,只需要把檔案名作為引數即可,
配置好的tasks.json檔案大致如下:
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "build(gcc)", "command": "gcc", "args": [ "-g", "-o", "/tmp/buildtempc", "*.c" // 匹配所有源檔案 ], "options": { "cwd": "${fileDirname}" // 定位到當前目錄 }, "group": { "kind": "build", "isDefault": true } } ] }
配置好的launch.json檔案大致如下:
{ "version": "0.2.0", "configurations": [ { "name": "debug(gdb)", "type": "cppdbg", "request": "launch", "program": "/tmp/buildtempc", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", // 定位到當前目錄 "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build(gcc)", } ] }
注意:匹配源檔案時一定要寫成'*.c',而不能寫成'*',因為頭檔案不是編譯單元,頭檔案在編譯源檔案時被處理,
在我的組態檔里,我將可執行檔案放在了'/tmp'目錄下,以使作業目錄看起來簡潔一些,
'.vscode'目錄下的組態檔對作業空間下的所有目錄和檔案都是有效的,現在我們只需要新建一個目錄,并在里面寫好頭檔案和源檔案,就可以編譯和除錯了,
目錄模式有一些缺陷:
|
? 頭檔案和源檔案放在一起會比較亂 ? 專案變多的時候,作業空間會比較亂 ? ‘C/C++’擴展會掃描作業空間內的所有檔案,如果專案變多會降低擴展性能,也會使擴展功能混亂 |
授之以魚不如授之以漁,
我強烈建議不要直接復制我的組態檔,而是要理解每個配置選項的意義和目的,從而寫出符合個人喜好的配置,
專案模式
對于目錄模式來說,如果作業空間的專案變多,就會出現麻煩,所以在專案模式里,每個專案獨占一個作業空間,類似VS的解決方案,
因為一個專案獨占一個作業空間,所以我們沒必要把所有檔案都擠在一起,還可以再細分,比如我喜歡分為“頭檔案”、“源檔案”、“資源檔案”,
“資源檔案”目錄用于除錯程式的相對位置讀寫,或者存放一些與編譯無關的其他檔案,每一個類別建立一個目錄,
'C/C++'擴展會掃描作業空間下的所有檔案,所以在寫#include時不需要指定檔案夾,代碼提示也能正常作業,
但是gcc在編譯時只會查找源檔案所在目錄下的頭檔案,所以需要額外引數指定頭檔案目錄,
另外,也需要指定需要編譯的源檔案目錄,
而資源檔案與編譯程序無關,需要修改除錯的組態檔,
配置好的tasks.json檔案大致如下:
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "build(gcc)", "command": "gcc", "args": [ "-g", "-o", "/tmp/buildtempc", "-iquote", // 指定頭檔案目錄 "Headers", // 頭檔案目錄 "Sources/*.c" // 源檔案目錄下的所有源檔案 ], "options": { "cwd": "${workspaceFolder}" // 定位到作業空間 }, "group": { "kind": "build", "isDefault": true } } ] }
配置好的launch.json檔案大致如下:
{ "version": "0.2.0", "configurations": [ { "name": "debug(gdb)", "type": "cppdbg", "request": "launch", "program": "/tmp/buildtempc", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}/Resources", // 定位到資源檔案目錄 "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build(gcc)", } ] }
這樣,就可以跟VS一樣在專案中寫代碼了,
當然,這種配置方法的缺點也顯而易見,新建一個專案的成本太大了,每新建一個專案就得再寫一次組態檔,并新建三個目錄,
不過,在Linux下,這些重復的作業當然是交給計算機來做,我們只需要保存一份'.vscode'模板就好,比如我保存在變數CODE_PATH表示的目錄下,每個專案的組態檔都是一樣的,直接拷貝就好,
Bash腳本如下:
#!/bin/bash # Filename: project-c # Create a C project, and open it in vscode. echo -n "project name: " read name name=$(date +%Y%m%d)-"$name" // 生成專案名 mkdir "$CODE_PATH"/"$name" // 新建專案目錄 cd "$CODE_PATH"/"$name" cp -r "$CODE_PATH"/.vscode . // 拷貝組態檔 mkdir Headers Sources Resources // 新建分類目錄 code . // 使用VS Code打開專案 cd - &> /dev/null
在腳本中,我給專案名稱加上了時間戳,方便查找與避免重名,啟動VS Code的命令是code,

不管你是轉行也好,初學也罷,進階也可
——【值得關注】我的C/C++編程學習進階俱樂部 ——
涉及到:C語言、C++、windows編程、網路編程、QT界面開發、Linux編程、游戲編程、黑客等等......
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/228350.html
標籤:C
