一、編譯多文件執(zhí)行
1、配置文件使多文件執(zhí)行
vscode 的配置分兩類,一是全局的用戶配置,二是當前工作區(qū)配置。vscode 打開的文件夾的根目錄是一個工作區(qū),.vscode目錄就是存放當前工作區(qū)相關(guān)配置文件的目錄。
這樣分享項目時,也把該項目的 vscode 配置分享出去了,保證了協(xié)同工作開發(fā)環(huán)境的統(tǒng)一性。
.vscode目錄下配置文件:
c_cpp_properties.json:是用于配置編譯器環(huán)境的,包括啟動器代號、位數(shù)(這些是自定義的)、編譯選項、啟動設(shè)置、編譯模式等;includePath指向C/C++標準庫、用戶頭文件所在位置;
setting.json:vscode編輯器和插件的相關(guān)配置;
launch.json:調(diào)試配置文件;
task.json:任務(wù)配置。
配置文件中一些常見的配置信息:
? version:版本號,不用修改
? configurations:數(shù)組類型,用來配置 每一項調(diào)試任務(wù)的具體配置信息
? type:調(diào)試環(huán)境的具體類型 node、java、cppdbg 等等
? name:調(diào)試任務(wù)的名稱,用與在下拉列表中展示
? program:啟動文件的路徑,對于該路徑中的變量,下面在介紹
? request:調(diào)試模式,一共有兩種模式
??env
:對象,程序啟動是傳遞的環(huán)境變量
??args
:程序啟動是傳遞的參數(shù)
??cwd
:程序啟動是的跟目錄配置
??window
:為 window 平臺單獨設(shè)置配置項
??linux
:為 linux 平臺單獨設(shè)置配置項
??osx
:為 Mac OS 平臺單獨設(shè)置配置項
? ${workspaceFolder}:項目文件夾在 VS Code 中打開的路徑
? ${file}:當前開打開(激活)的文件
? ${relativeFile}:相對于 {workspaceFolder} 的文件路徑
? ${fileBasename}:當前打開文件的名稱
? ${fileBasenameNoExtension}:當前打開文件的名稱,不帶擴展名的
? ${fileExtname}:當前打開文件的擴展名
? ${fileDirname}:當前打開文件的文件夾名稱
注:以下操作是在Vscode安裝好后,gcc編譯器下載好,環(huán)境變量添加完成后進行;
1.1 測試程序
下面編譯一個測試程序:
打開vscode,在里面創(chuàng)建一個工程,工程下面分別創(chuàng)建以下幾個文件夾“:build;src;inc;output;intput;doc”
build文件夾:用來存放編譯好的可執(zhí)行的.exe二進制文件
src文件夾:用來存放各個功能模塊的源文件
inc文件夾:用來存放各個功能模塊的頭文件
output文件夾:用來存放輸出文件
intput文件夾:用來存放輸入文件
doc文件夾:用來存放項目工程的說明文檔
好啦,來看看我們的工程長什么樣!(僅是個人習慣,文件夾可以隨自身習慣建立自己喜歡的)
在src文件夾下創(chuàng)建main.c和rgb.c文件:
#include<sys.h>
int main(int argc, char *argv[])
{
rgb();
printf("讀取bin文件結(jié)果:success\n");
printf("long = %d,wide = %d\n",long,wide);
system("pause");
return 0;
}
#include<rgb.h>
void rgb()
{
printf("讀取rgb文件結(jié)果:success\n");
}
在inc文件夾下創(chuàng)建sys.h和rgb.h文件:
#ifndef _SYS_H_
#define _SYS_H_
#include<rgb.h>
#define long 2560 //宏定義分辨率
#define wide 1440
#endif
#ifndef _RGB_H_
#define _RGB_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void rgb();
#endif
以上測試程序僅為了在inc下也有多個頭文件,實際使用寫在sys.h一個頭文件里也可以。
1.2 修改配置文件
c_cpp_properties.json文件中,includePath指向C/C++標準庫、用戶頭文件所在位置;c_cpp_properties.json文件夾如下:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceRoot}",
"D:/mingw64/include/**",
//"D:/my_code/isp_pipline/inc", //新建工程項目加上該工程項目的頭文件夾絕對路徑
"${workspaceFolder}\\inc", //新建工程項目加上該工程項目的頭文件夾相對路徑
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"__GNUC__=6",
"__cdecl=__attribute__((__cdecl__))"
],
"intelliSenseMode": "msvc-x64",
"browse": {
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "",
"path": [
"${workspaceRoot}",
"D:/mingw64/include/**",
//"D:/my_code/isp_pipline/inc", //新建工程項目加上該工程項目的頭文件夾絕對路徑
"${workspaceFolder}\\inc", //新建工程項目加上該工程項目的頭文件夾相對路徑
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed",
"D:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/include"
]
}
}
],
"version": 4
}
可以在下面紅框的位置加上上面新建工程中inc文件夾的絕對路徑
?當然上圖中修改方式并不好,加上新建項目頭文件絕對路徑,那么每建立一個項目就要加一個絕對路徑過于繁瑣,可以在下圖紅框中位置加上"${workspaceFolder}\\inc",表示該項目文件夾下的inc文件夾,是相對路徑。
tasks.json文件:
{
"version": "2.0.0",
"tasks": [
{//這個大括號里是‘構(gòu)建’任務(wù)
"label": "echo",//這個大括號里是‘構(gòu)建’任務(wù)
"type": "shell",//任務(wù)類型,process是vsc把預(yù)定義變量和轉(zhuǎn)義解析后直接全部傳給command;shell相當于先打開shell再輸入命令,所以args還會經(jīng)過shell再解析一遍
"command": "gcc", //編譯命令
"args": [ //傳給gcc命令的一系列參數(shù)
"-g", //生成和調(diào)試有關(guān)的信息
"${workspaceFolder}\\src\\*.c", //新建工程項目加上該工程項目的源碼文件夾路徑
"-I","${workspaceFolder}\\inc", //新建工程項目加上該工程項目的頭文件夾路徑
"-o", //指定輸出文件的路徑和名稱
"${workspaceFolder}\\build\\total.exe",//讓可執(zhí)行文件輸出到源碼文件所在的文件夾下的bin文件夾內(nèi),并且讓它的名字和源碼文件相同
"-fexec-charset=GBK"http://解決中文亂碼
]
}
],
"presentation": {//執(zhí)行這個任務(wù)時的一些其他設(shè)定
"echo": true,//表示在執(zhí)行任務(wù)時在終端要有輸出
"reveal": "always",//執(zhí)行任務(wù)時是否跳轉(zhuǎn)到終端面板,可以為always,silent,never
"focus": false,//設(shè)為true后可以使執(zhí)行task時焦點聚集在終端,但對編譯來說,設(shè)為true沒有意義,因為運行的時候才涉及到輸入
"panel": "new", //每次執(zhí)行這個task時都新建一個終端面板
"showReuseMessage": true,//控制是否顯示“終端將被任務(wù)重用, 按任意鍵關(guān)閉”提示.
"clear": false
}
}
tasks.json文件修改下圖紅框的位置;為了調(diào)試方便使用-g讓可執(zhí)行程序包含調(diào)試信息,用-I指定頭文件路徑;-o指定輸出文件的路徑和名稱
下面的參數(shù)表示意思如下:
gcc -g ${workspaceFolder}\\src\\*.c -I ${workspaceFolder}\\inc -o ${workspaceFolder}\\build\\total.exe
編譯的修改方式有很多,比如改成
gcc -c ${workspaceFolder}\\src\\*.c -I ${workspaceFolder}\\inc 也可以編譯,如下圖
?launch.json文件如下:
{
"version": "0.2.0",
"configurations": [
{/*這個大括號里是我們的‘調(diào)試(Debug)’配置,這里我解釋下為什么寫了兩個,
因為有時VSCode會有閃現(xiàn)的問題,也就是運行程序后窗口控制臺可能會一閃而過,
看不到結(jié)果,因此可以通過搭建configution的辦法來解決,也就是搭建一個cmd的配置。*/
"name": "(Windows) Launch",// 配置名稱
"type": "cppvsdbg",// 配置類型,cppdbg對應(yīng)cpptools提供的調(diào)試功能;可以認為此處只能是cppdbg
"request": "launch",// 請求配置類型,可以為launch(啟動)或attach(附加)
"program": "cmd",// 將要進行調(diào)試的程序的路徑
"preLaunchTask": "echo", // 調(diào)試開始前執(zhí)行的任務(wù),我們在調(diào)試前要編譯構(gòu)建。與tasks.json的label相對應(yīng),名字要一樣
"args": [ // 程序調(diào)試時傳遞給程序的命令行參數(shù)
"/C",
"${workspaceFolder}\\build\\total.exe",
"&",
"echo."
],
"stopAtEntry": false, // 設(shè)為true時程序?qū)和T诔绦蛉肟谔?,相當于在main上打斷點
"cwd": "${workspaceFolder}",// 調(diào)試程序時的工作目錄,此處為源碼文件所在目錄
"environment": [],// 環(huán)境變量,這里設(shè)為空即可
"console": "externalTerminal",//使用單獨的cmd窗口輸出
},
{//這個大括號里是我們的‘調(diào)試(Debug)’配置
"name": "(gdb) Launch",// 配置名稱
"type": "cppdbg",// 配置類型,cppdbg對應(yīng)cpptools提供的調(diào)試功能;可以認為此處只能是cppdbg
"request": "launch",// 請求配置類型,可以為launch(啟動)或attach(附加)
//"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",// 將要進行調(diào)試的程序的路徑
"program": "C:\\Windows\\system32\\cmd.exe",
"args": [
"/C",
"${workspaceFolder}\\build\\total.exe",
"&",
"pause"
], // 程序調(diào)試時傳遞給程序的命令行參數(shù),
"stopAtEntry": false, // 設(shè)為true時程序?qū)和T诔绦蛉肟谔?,相當于在main上打斷點
"cwd": "${workspaceFolder}",// 調(diào)試程序時的工作目錄,此處為源碼文件所在目錄
"environment": [],// 環(huán)境變量,這里設(shè)為空即可
//"console": "externalTerminal",// 使用單獨的cmd窗口輸出
"externalConsole": true,
"MIMode": "gdb", //指定連接的調(diào)試器,gdb是minGW中的調(diào)試程序
"miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe",//指定調(diào)試器所在路徑,如果你的minGW裝在別的地方,則要改成你自己的路徑,注意間隔是\\
"preLaunchTask": "echo",//調(diào)試開始前執(zhí)行的任務(wù),這里和task.json的label相對應(yīng)
}
]
}
將下圖紅框中的位置改為需要輸出的可執(zhí)行文件的路徑即可,調(diào)試使用的路徑。
?setting.json不做修改
{
"files.associations": {
"cctype": "c",
"climits": "c",
"cmath": "c",
"cstdarg": "c",
"cstdint": "c",
"cstdio": "c",
"cstdlib": "c",
"limits": "c",
"type_traits": "c"
}
}
如下圖所示,修改上方配置后,按F5測試代碼生成結(jié)果如下紅框中,build文件夾下生成了total.exe可執(zhí)行文件;終端上是編譯命令;
2、配置文件僅當前打開的文件執(zhí)行
2.1 配置文件
針對只編譯當前打開的文件,setting.json和c_cpp_properties.json不需要動;
?將tasks.json修改成下圖紅框中的內(nèi)容;
表示編譯當前打開的文件在當前建立的項目的build文件夾下生成當前打開的文件名稱的exe可執(zhí)行文件。
依據(jù)自己的習慣對生成文件的路徑和名稱做調(diào)節(jié):${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe
{
"version": "2.0.0",
"tasks": [
{//這個大括號里是‘構(gòu)建’任務(wù)
"label": "echo",//這個大括號里是‘構(gòu)建’任務(wù)
"type": "shell",//任務(wù)類型,process是vsc把預(yù)定義變量和轉(zhuǎn)義解析后直接全部傳給command;shell相當于先打開shell再輸入命令,所以args還會經(jīng)過shell再解析一遍
"command": "gcc", //編譯命令
"args": [ //傳給gcc命令的一系列參數(shù)
/*"-g", //生成和調(diào)試有關(guān)的信息
"${workspaceFolder}\\src\\*.c", //新建工程項目加上該工程項目的源碼文件夾路徑
"-I","${workspaceFolder}\\inc", //新建工程項目加上該工程項目的頭文件夾路徑
"-o", //指定輸出文件的路徑和名稱
"${workspaceFolder}\\build\\total.exe",//讓可執(zhí)行文件輸出到源碼文件所在的文件夾下的bin文件夾內(nèi),并且讓它的名字和源碼文件相同
"-fexec-charset=GBK"http://解決中文亂碼*/
"-g", //生成和調(diào)試有關(guān)的信息
"${file}", //指定要編譯的是當前文件
"-o", //指定輸出文件的路徑和名稱
"${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe",//讓可執(zhí)行文件輸出到源碼文件所在的文件夾下的bin文件夾內(nèi),并且讓它的名字和源碼文件相同
"-fexec-charset=GBK"http://解決中文亂碼
]
}
],
"presentation": {//執(zhí)行這個任務(wù)時的一些其他設(shè)定
"echo": true,//表示在執(zhí)行任務(wù)時在終端要有輸出
"reveal": "always",//執(zhí)行任務(wù)時是否跳轉(zhuǎn)到終端面板,可以為always,silent,never
"focus": false,//設(shè)為true后可以使執(zhí)行task時焦點聚集在終端,但對編譯來說,設(shè)為true沒有意義,因為運行的時候才涉及到輸入
"panel": "new", //每次執(zhí)行這個task時都新建一個終端面板
"showReuseMessage": true,//控制是否顯示“終端將被任務(wù)重用, 按任意鍵關(guān)閉”提示.
"clear": false
}
}
launch.json需要將下圖紅框的位置修改成上面tasks.json指定生成的可執(zhí)行文件exe文件的路徑,程序調(diào)試需要找到該生成物的路徑。
2.2 測試程序
在src文件夾下新建一個test.c文件,測試程序如下:
//#include<sys.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
//rgb();
printf("讀取bin文件結(jié)果:success\n");
//printf("long = %d,wide = %d\n",long,wide);
system("pause");
return 0;
}
打開當前test.c文件,按F5調(diào)試生成結(jié)果如下圖紅框中,僅編譯當前test.c文件并輸出test.exe文件到build目錄下,shell輸出正確。
3、配置文件指定的多個文件執(zhí)行
這種方式僅作了解,并不實用;
兩種方式:
1)將task.json文件改成下圖紅框所示,指定編譯固定的.c文件,并輸出指定的可執(zhí)行文件到指定目錄;
將#include<sys.h>頭文件修改成#include"..\inc\sys.h"相當路徑;
將#include<rgb.h>頭文件修改成#include"..\inc\rgb.h"相當路徑;
注意是include""而不是include<>
#include<>:編譯器直接從系統(tǒng)類庫目錄里查找頭文件:
#include"":默認從項目當前目錄查找頭文件,所謂項目當前目錄,就是項目工程文件(*.vcxproj)所在的目錄
1、#include<>一般用于包含系統(tǒng)頭文件,諸如stdlib.h、stdio.h、iostream等;
2、#include""一般用于包含自定義頭文件,比如我們自定義的test.h、declare.h等。
直接在項目當前目錄使用相對路徑查找頭文件,則去掉上方c_cpp_properties.json文件中,添加的includePath指路徑也可以,留著也不影響;
2)也可以將頭文件修改成以下
將#include<sys.h>頭文件修改成#include"D:\my_code\isp_pipline\inc\sys.h"絕對路徑;
將#include<rgb.h>頭文件修改成#include"D:\my_code\isp_pipline\inc\rgb.h"絕對路徑;
關(guān)鍵是要讓編譯的.c文件能夠查找到該頭文件的位置。
輸出結(jié)果如下紅框,可以看到src文件夾下的test.c并沒有編譯進去,輸出正確
4、手動編譯執(zhí)行
在終端上輸入命令gcc -g src/main.c src/rgb.c -o build/total.exe
將前兩者聯(lián)合編譯為可調(diào)式文件total.exe放在build文件夾下;
編譯的路徑是在項目工程路徑下,所以編譯main.c的地址是src/main.c
.\build\total執(zhí)行可執(zhí)行文件,可以看到下圖終端上輸出結(jié)果正確。
-g 可執(zhí)行程序包含調(diào)試信息
-o 指定輸出文件名
-c 只編譯不鏈接
-I(i的大寫):指定頭文件路徑(相對路徑或覺得路徑,建議相對路徑)
-L :指定連接的動態(tài)庫或者靜態(tài)庫路徑(相對路徑或覺得路徑,建議相對路徑)
-l(L的小寫):指定需要鏈接的庫的名字
(鏈接靜態(tài)庫libc.a:-lc 鏈接動態(tài)庫libc.so : -lc 注意:-l后面直接添加庫名省區(qū)“l(fā)ib”和“.so”或“.a” )
問題:
問題1:-l(L的小寫)鏈接的到底是動態(tài)庫還是靜態(tài)庫
答案:如果鏈接路徑下同時有 .so 和 .a ?那優(yōu)先鏈接 .so ?
問題2:如果路徑下同時有靜態(tài)庫和動態(tài)庫如何鏈接靜態(tài)庫
答案:使用顯示鏈接, ? ? ? gcc ? ? ?-l:lib***.a ? ?(將靜態(tài)庫的名字顯示寫出來)
或者在 gcc 編譯的時候 加入?yún)?shù) -static -lXXX, 則可以添加路徑下面的靜態(tài)庫。
?
二、配置終端命令行
有時會遇到終端上敲不了命令的情況:
1)新建終端
?2)選擇下圖右下角紅框默認配置文件
3)選擇第一項command prompt即可(系統(tǒng)自帶的命令行程序);
?4)終端上敲回車就可以敲命令了
參考文章:
gcc -I -i -L -l 參數(shù)區(qū)別 / -l(靜態(tài)庫/動態(tài)庫)_gcc -i_Kolde的博客-CSDN博客https://blog.csdn.net/abcdu1/article/details/86083295文章來源:http://www.zghlxwxcb.cn/news/detail-738361.html
VS Code 配置調(diào)試參數(shù)、launch.json 配置文件屬性、task.json 變量替換、自動保存并格式化、空格和制表符、函數(shù)調(diào)用關(guān)系、文件搜索和全局搜索、_vscode launch.json_wohu007的博客-CSDN博客https://blog.csdn.net/wohu1104/article/details/111464778VSCode配置終端為cmd命令行程序的操作步驟_vscode配置cmd終端_Seekladoom的博客-CSDN博客https://blog.csdn.net/Seekladoom/article/details/124004221Vscode C語言實現(xiàn)多文件編譯 - 知乎背景:很多大項目都是一人負責一個模塊,在實際應(yīng)用中不可能每個人都打開同一個main.c文件寫自己的模塊,因此會出現(xiàn)將函數(shù)在一個自定義的.h文件中聲明,在一個.c文件中定義,并在main.c中調(diào)用的情況。此時將這個自…https://zhuanlan.zhihu.com/p/624788168Windows下用VScode編寫C++程序如何添加并應(yīng)用自定義頭文件_Penguuuuiiiiiiin的博客-CSDN博客Windows下用VScode編寫C++程序如何添加并應(yīng)用自定義頭文件關(guān)鍵詞:Windows,CPP,VScode,自定義頭文件一個編程小白,正在試著用vscode學CPP,標準庫應(yīng)用沒有問題,但自定義的頭文件和自定義頭文件中聲明的函數(shù)用不了。剛剛被這個問題整個半死,花了一晚上終于解決了。整體如下main函數(shù)引用了一個include文件夾中自定義的.h文件,并在lib文件夾里有相應(yīng).cp...https://blog.csdn.net/Penguuuuiiiiiiin/article/details/104191496文章來源地址http://www.zghlxwxcb.cn/news/detail-738361.html
到了這里,關(guān)于VScode編譯多文件執(zhí)行與配置終端命令行的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!