最近在做深度學(xué)習(xí)的C++部署相關(guān)工作,于是寫下這篇文檔記錄環(huán)境配置的過程。環(huán)境配置是一項(xiàng)非常繁瑣的工作,無論從大學(xué)做相關(guān)作業(yè)還是到工作上。做這項(xiàng)工作需要技術(shù)的同時(shí),還需要點(diǎn)運(yùn)氣。當(dāng)然遇到無法解決的玄學(xué)問題,最終只有一個(gè)辦法:重啟設(shè)備。
本篇文章以環(huán)境為設(shè)置分為兩個(gè)環(huán)境進(jìn)行部署,一個(gè)是Linux和Win10部署的部分。Linux部分部署時(shí)因?yàn)闊o論是端側(cè)部署應(yīng)用還是服務(wù)端部署應(yīng)用都會涉及到Linux。而Windows部署則是為了方便我在自己筆記本上進(jìn)行學(xué)習(xí)練習(xí)才記錄下來的。那么現(xiàn)在就開始我們的環(huán)境配置部署之路。
無論是Linux還是Win10環(huán)境,先寫一個(gè)測試的?hello world代碼:
#include<iostream>
using namespace std;
int main(){
cout<<"hello world"<<endl;
}
Linux
我的Linux版本是:Linux ubuntu 5.15.0-56-generic #62-Ubuntu SMP Tue Nov 22 19:54:14 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
。通過Win10設(shè)備上的VSCode連接到服務(wù)器上的。要配置C++環(huán)境,那么要先把vscode上的C++擴(kuò)展安裝好,如下圖所示:
在配置好vscode的環(huán)境后,需要在當(dāng)前項(xiàng)目的.vscode
文件夾下配置task.json
、launch.json
和c_cpp_properties.json
文件,其中task.json
用于編譯器配置,launch.json
用于調(diào)試器設(shè)置,c_cpp_properties.json
用于編譯器路徑和IntelliSense設(shè)置。
編譯
新建task.json
文件,該文件是告訴vscode如何編譯程序,大概用途是使用g++
編譯器編譯源文件為可執(zhí)行文件。task
內(nèi)容如下:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "g++ build active file",
"command": "/usr/bin/g++",
"args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
command
變量指定了那個(gè)編譯器會被使用,這里就是 /usr/bin
目錄下的 g++
編譯器;args
這個(gè)參數(shù)列表給出了我們需要傳遞給g++
編譯器的命令參數(shù),需要符合g++
命令行的參數(shù)順序,${file}
代表目前編輯器打開的文件,${fileDirname}
代表當(dāng)前活躍文件的目錄,${fileBasenameNoExtension}
為生成的文件名,與被編譯的文件名相同。label
變量的值為終端任務(wù)中名字,你可以任意修改;group
變量中的 "isDefault":true
代表了當(dāng)按下Ctrl+Shift+B
時(shí),會對當(dāng)前活躍的文件進(jìn)行編譯,僅僅是為了方便。關(guān)于更多的變量定義可以參考:Variables Reference
用VS Code
打開tmp.cpp
源文件,并處于編輯界面,按下 Ctrl+Shift+B
鍵 (或者在 主菜單->終端->運(yùn)行生成任務(wù) ),tasks.json 就會被執(zhí)行。
運(yùn)行該文件,輸出hello world
。
要注意:要讓tmp.cpp
(即你要編譯的文件)處于活躍狀態(tài)。
調(diào)試
調(diào)試文件主要使用launch.json
文件,該文件配置VS Code下的GDB調(diào)試器。GDB調(diào)試器安裝命令:apt-get install build-essential gdb
。launch.json
內(nèi)容:
{
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
],
"version": "2.0.0"
}
其中,program
變量指定你想要調(diào)試的文件,這里被設(shè)置為活躍文件夾${fileDirname}
下的活躍文件${fileBasenameNoExtension}
,如果tmp.cpp
處于活躍, 那么tmp
會被調(diào)試。默認(rèn)情況下,C++ 擴(kuò)展不會添加斷點(diǎn)到源文件中,stopAtEntry
默認(rèn)被設(shè)置為flase
,如果設(shè)置為true
的話,那么調(diào)試器會在main
方法入口暫停。
配置OpenCV
如果你需要更多關(guān)于 C/C++ 擴(kuò)展的使用,你可以創(chuàng)建一個(gè)c_cpp_properties.json
文件,這個(gè)可以讓你去改變一些設(shè)置,例如編譯器的路徑、C++ 標(biāo)準(zhǔn)等。你可以在 VS Code 中按下 Ctrl+Shift+P
鍵,并在命令行中輸入C/C++
,可以在下拉菜單中選擇C/C++
配置,這樣在 .vscode
文件夾下出現(xiàn)c_cpp_properties.json
文件,同時(shí)在 VS Code 界面出現(xiàn)一個(gè)設(shè)置窗口,你可以按照你的需要在里面修改一些 C/C++ 的配置。
要配置opencv,當(dāng)然要先安裝好OpenCV,可參考該文章:筆記—Linux安裝OpenCV及VSCode的配置編譯和實(shí)踐出真知——Ubuntu 18.04 VSCODE配置OpenCV4.5運(yùn)行YOLO4模型。
新建c_cpp_properties.json
文件,內(nèi)容如下:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/opencv2"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
主要是inclodePath
要包含opencv頭文件的路徑。
修改task.json
文件,因?yàn)樾枰尤雘pencv的動(dòng)態(tài)鏈接庫:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"`pkg-config", "--cflags", "--libs", "opencv4`",
// "-I", "/usr/local/include",
// "-I", "/usr/local/include/opencv4",
// "-I", "/usr/local/include/opencv4/opencv2",
// "-L", "/usr/local/lib",
// "-l", "opencv_core",
// "-l", "opencv_imgproc",
// "-l", "opencv_imgcodecs",
// "-l", "opencv_video",
// "-l", "opencv_ml",
// "-l", "opencv_highgui",
// "-l", "opencv_objdetect",
// "-l", "opencv_flann",
// "-l", "opencv_imgcodecs",
// "-l", "opencv_photo",
// "-l", "opencv_videoio"
],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
最終像上述的編譯調(diào)試運(yùn)行以下程序代碼即可:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc,char** argv){
std::cout<<"111"<< std::endl;
cv::Mat src = cv::imread("./src/model_optimize.jpg");
cv::resize(src,src,cv::Size(500,800));
imwrite("./test.jpg", src);
return 0;
}
Win10
要在Win10上調(diào)試C++程序,那么就要先安裝好MinGW
并進(jìn)行配置。在這一步這里就不展開了。
編譯調(diào)試
編譯調(diào)試跟Linux原理差不多,將task.json
以及launch.json
里面的g++
和gdb
路徑配置好即可,文件內(nèi)容如下:
task.json
:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "g++ build active file",
"command": "C:/mingw64/bin/g++.exe",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
// "-I", "/usr/local/include",
// "-I", "/usr/local/include/opencv4",
// "-I", "/usr/local/include/opencv4/opencv2",
// "-L", "/usr/local/lib",
// "-l", "opencv_core",
// "-l", "opencv_imgproc",
// "-l", "opencv_imgcodecs",
// "-l", "opencv_video",
// "-l", "opencv_ml",
// "-l", "opencv_highgui",
// "-l", "opencv_objdetect",
// "-l", "opencv_flann",
// "-l", "opencv_imgcodecs",
// "-l", "opencv_photo",
// "-l", "opencv_videoio"
],
"options": {
"cwd": "C:/mingw64/bin"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
launch.json
文件如下:
{
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "g++ build active file",
"miDebuggerPath": "C:/mingw64/bin/gdb.exe"
}
],
"version": "2.0.0"
}
配置OpenCV
opencv版本:4.6.10。配置OpenCV的工作原理:對OpenCV的源碼進(jìn)行編譯,然后在VSCode上進(jìn)行配置。
(1)源碼編譯
編譯安裝的環(huán)境:
- cmake version 3.9.0-rc3
- mingw 5.3.0
設(shè)置好源碼路徑已經(jīng)生成路徑,點(diǎn)擊configure
按鈕,注意:選擇生成MinGW Makefiules
,選擇Specify native compilers
,最后配置你的編譯器路徑。
點(diǎn)擊Generate
按鈕。
到設(shè)置的路徑,這里是:C:\opencv\build\x64\mingw
下執(zhí)行:minGW32-make -j8
執(zhí)行minGW32-make install
最后在bin
下生成結(jié)果,并將C:\opencv\build\x64\mingw\bin
配置到環(huán)境路徑下。
遇到的問題:文章來源:http://www.zghlxwxcb.cn/news/detail-480301.html
- 編譯生成報(bào)如圖下的錯(cuò),因?yàn)镺penCV版本太old了。最終更新至4.6.10。
解決方案:OpenCV + CLion在windows環(huán)境下使用CMake編譯, 出現(xiàn)Mutex相關(guān)的錯(cuò)誤的解決辦法文章來源地址http://www.zghlxwxcb.cn/news/detail-480301.html
- 出現(xiàn)“Unexpected GDB output from command “-exec-run”.”
StackOverFlow上的解決方案:ERROR: Unable to start debugging. Unexpected GDB output from command “-exec-run”. Unable to find Mach task port for process-id 1401
參考
- 如何在 Linux 系統(tǒng)中的 VS Code 上配置 C/C++ 環(huán)境
- VSCode+Opencv(C++)+Win10
- VScode搭建OpenCV環(huán)境??????,推薦。
- OpenCV使用CMake和MinGW-w64的編譯安裝??????,推薦
- OpenCV-MinGW-Build:已經(jīng)編譯好的OpenCV庫
到了這里,關(guān)于VSCode配置C++開發(fā)環(huán)境:OpenCV的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!