環境說明
在此演示的是Ubuntu 18.04系統下的環境配置, 但大部分是通用的, 所以用MacOS和win10(對, 不是Windows, 是win10, 別問我為什么)的小伙伴也能看看.
首先, 你得安裝vscode...
安裝好了之后,要添加c++擴展,這一部一般不會出什么問題, 我在win10環境、MacOS環境乃至另一台電腦的Ubuntu 18.04環境里都沒遇到這個問題,但偏偏在公司電腦上,出現了/home/username/.vscode/extensions 沒有讀寫權限的問題,可以手動下載擴展解決,也可以用
sudo chmod o+w '/home/username/.vscode
sudo chmod o+w '/home/username/.vscode/extensions
兩句命令強行修改文件夾讀寫權限,然后愉快地在vscode中直接添加C++擴展了。
添加擴展
這個可說的不多,直接在Extension中搜C++,然后選且只選第一個擴展

安裝之后,這一步就大功告成。
vscode-cpptools 配置
這一部分,是通用的C++編譯、debug配置,主要設計兩個文件。
launch.json
這個文件主要是配置debug,具體設置如下:
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/${fileBasenameNoExtension}.o", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb", "preLaunchTask": "g++", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] }, ] }
我主要關注三個參數:
- program
這一參數指明debug時運行哪個程序,"program": "${workspaceFolder}/${fileBasenameNoExtension}.o",
表明是要運行當前目錄中與被編譯文件同名的.o后綴文件 - MIMode
這一參數指明要使用的debug工具,Ubuntu環境下當然是gdb。win10環境下是MinGW,MacOS環境下是lldb。 - miDebuggerPath
這一句也很重要。在默認生成的launch.json文件中並沒有這一參數的設置語句,但這一句卻是最重要的,因為有了這一句,vscode在編譯運行cpp文件時才能找到gdb程序。
一般情況下,gdb是被安裝在/usr/bin/gdb目錄下,所以這一句為:"miDebuggerPath": "/usr/bin/gdb",
當然這里的理解都很粗淺,要詳細了解launch.json文件,還是到擴展的官網上去看看。
設置好launch.json文件后,按道理已經可以試着運行cpp文件了,當然你一試vscode就會提示你不存在jiayiju${fileBasenameNoExtension}.o
,因為我們還沒有編譯呢。
所以,要在launch.json中加一句"preLaunchTask": "g++",
,指定一個運行前任務,編譯我們寫好的cpp文件。
task.json
一般情況下,在上一步運行失敗之后,會直接提示你設置task.json文件,如果沒有,你也可以點擊Ctrl+Shift+P"調出命令面板,然后搜索Task,點擊第一個

會提示你依據模板創建task.json,這里不管什么模板,隨便選一個,然后直接復制粘貼以下設置代碼:
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "command": "g++", "args": [ "-g", "-std=c++11", "${file}", "-o", "${fileBasenameNoExtension}.o", ],// 編譯命令參數 "problemMatcher":{ "owner": "cpp", "fileLocation":[ "relative", "${workspaceFolder}" ], "pattern":[ { "regexp": "^([^\\\\s].*)\\\\((\\\\d+,\\\\d+)\\\\):\\\\s*(.*)$", "file": 1, "location": 2, "message": 3 } ] }, "group": { "kind": "build", "isDefault": true } }
這部分代碼中,重點當然在
"command": "g++", "args": [ "-g", "${file}", "-o", "${fileBasenameNoExtension}.o", ],// 編譯命令參數
明眼人一看就知道這就是g++編譯命令,不必多說。要注意最后一個參數"${fileBasenameNoExtension}.o",
,必須跟launch.json中program參數("${workspaceFolder}/${fileBasenameNoExtension}.o"
)的文件名相對應。
還有一點就是,如果要設置label參數的話,要將之設置為preLaunchTask的值。不記得preLaunchTask的童鞋回頭看看launch.json。
這部分通用的C++編譯運行設置就OK了,現在你可以愉快地用vscode寫hello world了,但是我們的征程是星辰大海和opnencv,所以,還得繼續折騰。
OpenCV 編譯環境配置
配置opencv,其實主要就解決兩個問題,一個是頭文件包含,一個是庫文件搜索。頭文件包含在c_cpp_properties.json中解決,庫文件包含則要繼續修改task.json中的編譯命令。
首先來看c_cpp_properties.json:
c_cpp_properties.json
怎么打開這個文件呢,兩種方式,一個就是打開命令面板(還記得那個快捷鍵嗎?我一直記,一直忘),然后搜索cpp: Edit,點擊結果就可以進入這一文件。
另一種就是在自己的cpp文件里直接包含opencv庫,聰明的cpp擴展會給你一個小提示提醒你打開c_cpp_properties.json設置頭文件包含。
不說廢話:
{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "/usr/local/include", //請確保你的opencv opencv2頭文件夾安裝在這個目錄 "/usr/include" ], "defines": [], "compilerPath": "/usr/bin/gcc", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "clang-x64" } ], "version": 4 }
task.json
上一步解決頭文件包含,這里就要解決庫文件搜索,也簡單,直接修改編譯命令,也就是task.json中的args參數:
"args": [ "-g", "-std=c++11", "${file}", "-o", "${fileBasenameNoExtension}.o",// 設置動態鏈接庫 "-I", "/usr/local/include", "-I", "/usr/local/include/opencv", "-I", "/usr/local/include/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" ],// 編譯命令參數
其中-I表示頭文件目錄,-L表示庫文件目錄,-l表示庫文件。
注意,這里有個天坑。
一般來說,"-l", "opencv_core",
這一語句的后一個參數表示庫文件名,而且是去掉.dll、.lib、.so、.a后綴的,但是Ubuntu系統編譯的opencv庫文件命名方式大多數為libxxx.so,所以如果你很老實的去個后綴,寫成"-l", "libopencv_core",
,那我跟你講,報錯報到你懷疑人生!!!
庫文件坑踩過以后,又遇到個偶發事件,缺少libjasper.so.1,有啥辦法,安裝唄。
命令如下:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt update sudo apt install libjasper1 libjasper-dev
搞定這個之后,基本上就大功告成,如有其他問題,歡迎討論。
感謝
libjasper.so.1問題的解決:
https://blog.csdn.net/weixin_41053564/article/details/81254410
各個json文件設置的參考:
https://blog.csdn.net/zoeou/article/details/80934367
作者:剎那里
鏈接:https://www.jianshu.com/p/6d3f4a30945d
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。