0.参考链接:
3.VsCode如何使用国内镜像秒下载
4.基于 VS Code 搭建编程环境——C/C++ 篇
1.同一个文件夹下包含头文件编写实现
头文件+源文件在一个文件夹中
launch.json是调试的配置,tasks.json是编译的配置,调试运行需要用到,如果是终端用cmake编译都不需要
只需要c_cpp_properties.json来起一个找文件路径和智能提示的作用,还能取消报红
ctrl+shift+p进行配置和调试的修改
出现错误:
原因:
vscode的C/C++插件 默认情况 下只能编译调试一个cpp文件。
当加上一个自己写的头文件的时候,如果头文件中的函数定义就在头文件中实现的时候,vscode也一样可以编译调试。
但是当我们将头文件中声明的函数在源文件中实现的时候,vscode找不到func.cpp源文件了,所以会报错main.cpp中未定义。
解决方法:
修改tasks.json文件中的"args"[] 中的-g包含的cpp文件
args下有三个重要的配置:
- -g:参与调试的cpp文件
- -I:参与调用的头文件
- -o:生成的可执行文件(比如:win下是exe…)
这里的法则是:
加上func.cpp的编译就可以了
*.cpp是模糊搜索,所有cpp的文件都参与调试
2.分文件夹编写(自己手写.h)
在主文件下创建两个文件夹,一个include包含头文件,一个是src包含源文件
这时运行发现,出现如下错误:
如果头文件和源文件在一起,编译器可以在同文件夹下找到。
但我们将func.h文件放到了子文件夹下,编译器找不到头文件了。
也可以给具体名字,具体哪个文件夹下的哪个文件
运行成功:
3.配置库文件(以opencv举例)
之前的头文件和源文件是我们自己写的,一些大型的库是直接封装好,只给你了库文件(.a或.so)和头文件,这时候我们不需要再对源文件进行编译了,而是要链接上他所给的库文件。
下面给一段测试代码:
#include<iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
cout << "This is a test!" << endl;
cout << "----------------" << endl;
Mat img = imread("./ubuntu.png",IMREAD_COLOR);
imshow("UBUNTU", img);
waitKey(0);
return 0;
}
之前Ubuntu系统里面已经装好了opencv3.2.0,用locate opencv找到他的头文件和库文件的位置
我的头文件路径是在:/usr/local/include/opencv2/**.hpp
库文件路径是在:/usr/local/lib/…
一定要把具体的库写上,这里注意的是虽然库文件是lib*.a或者lib*.so这样的格式,但是要去掉前面的lib和后面的后缀。
这样就就是把库文件链接好了。
4.插件code_runner的使用----配置多cpp文件编译
单个cpp文件直接运行就可以了,但是当我们自己提供源文件的时候,默认只是会编译main.cpp
报错:
[Running] cd “d:\vscode_project” && g++ test.cpp -o test && "d:\vscode_project"test
C:/TDM-GCC-64/bin/…/lib/gcc/x86_64-w64-mingw32/10.3.0/…/…/…/…/x86_64-w64-mingw32/bin/ld.exe: C:\Users\59723\AppData\Local\Temp\ccUv3ptC.o:test.cpp:(.text+0xe): undefined reference to `printHello()’
collect2.exe: error: ld returned 1 exit status
[Done] exited with code=1 in 0.481 seconds
在设置中搜索code,找到code-runner的设置:
进入以后找到cpp的配置进行修改:将 $fileName 替换为 *.cpp,即可编译文件下所有的cpp文件了。
setup 只编译 main.cpp,忽略所有其他 cpp,或者需要用 main 编译的 c 文件
5.C++项目调试配置
项目基于:【回环检测】DLoopDetector(C++)代码阅读笔记
5.1 配置JSON文件
快捷键【Ctrl+Shift+P】打开命令面板,输入C++ Edit
选择UI配置(就是窗口界面配置,去c_cpp_properties.json配置一样的),进入到IntelliSense 配置。
选择你的编译器路径,我用的是cpp语言,所以选择/usr/bin/g++
选择IntelliSense模式,电脑是64位的Linux 默认为 linux-gcc-x64
包含路径:include 路径是包括源文件中随附的头文件(如 #include “myHeaderFile.h”)的文件夹。
都配置完成后,左侧资源管理器会出现一个.vscode的文件夹,里面出现了两个配置文件,c_cpp_properties.json和settings.json,刚才在UI配置中修改的都会在这里实时修改
配置好后找到demo_brief.cpp,点击右上角有运行/调试,选择g++
出现了很多报错,是因为还没有配置.h和库文件所致。
左侧新增了一个task.json文件,按照之前说的添加上去,过程其实有点麻烦,添加后的:
其中有很多预先定义变量:vs code中的类似${workspaceFolder}的变量的解释
c_cpp_properties.json:主要负责智能提示和爆红
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include/DBoW2",
"/usr/local/include/DUtils",
"/usr/local/include/DUtilsCV",
"/usr/local/include/DVision",
"include/DLoopDetector"
],
"defines": [],
"compilerPath": "/usr/bin/g++",
"cStandard": "c11",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
task.json:主要负责运行和调试
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g","${file}",
"-o","${fileDirname}/${fileBasenameNoExtension}",
"-I","/usr//include",
"-I","/usr/local/include/DBoW2",
"-I","/usr//include/opencv2",
"-I","/usr/local/include/DUtilsCV",
"-I","/usr/local/include/DUtils",
"-I","/usr/local/include/DVision",
"-I","${workspaceFolder}/include/DLoopDetector",
"-L","/usr/local/lib",
"-l","DBoW2",
"-l","DLib",
"-L","/usr/lib",
"-L","/usr/lib/x86_64-linux-gnu",
"-l","opencv_core",
"-l","opencv_imgcodecs",
"-l","opencv_flann",
"-l","opencv_features2d",
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
中间过程遇到了一个小问题,就是libDBoW2.so和libDLib.so这两个库放在/usr/local/lib下找不到,参考网上一些建议将他们复制到了/usr/lib下,可以了