最近在看CS:APP,由于vscode中集成了终端,而且win10下的wsl在安装了图形界面之后,使用vscode不要太爽。
vscode是可以使用debug的,但是需要自己设置一下,这里有官方的文档https://code.visualstudio.com/docs#vscode可以参考(你也可以在vscode菜单栏->帮助->文档中打开)。但是微软介绍的内容可以使用但是很繁琐(这很巨硬),我花费了一个下午的时间,在win10下使用明白了,接着就去Ubuntu下尝试了下,但是微软的文档中没有Linux下的配置过程,只有在wsl下的使用方法(说好的Microsoft Love Linux呢!)。
我只好再安装了clang和lldb后使用mac下的内容尝试了下,这时机缘巧合下发现了本文要介绍的方法。
再次吐槽下,Ubuntu下的操作非常简单,Win10下就呵呵了,所以就先讲Ubuntu下的操作。
好了,扯了这么多下面上正题。
--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------
- Ubuntu下的操作
Ubuntu下相比Windows下简单很多,你只需要安装好你需要的软件,环境基本就建好了。
1、环境准备
安装gcc和g++,18.04之后出现了最小安装模式,只有基本的内核和必要的工具,gcc和g++的工具基本上是没有安装的,需要手动安装一下
sudo apt-get install gcc g++
安装之后,可以检验一下是否安装成功了
leewwe@leewwe:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
leewwe@leewwe:~$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
2、在vscode中安装调试
(1)打开一个文件夹
(2)新建cpp源代码
示例代码
//helloworld.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code!"};
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
return 0;
}
(3)按Ctrl+Alt+P启动命令面板 或者 菜单栏->查看->命令面板
输出的样子可能有区别,我这个是用过的,所以会推荐出我最近使用的内容。
(4)在输入栏里出入c/c++(大小写都行),向下滚轮,找到如下两个内容
C/C++:编辑配置(UI)[C/C++:Edit Configuration(UI)]
C/C++:编辑配置(JSON)[C/C++:Edit Configuration(JSON)]
注意没点的时候的绿色框
UI就是使用一个简单的UI来编写你的.json配置文件,和使用JSON的方法本质是一样的,只不过JSON的方法更加灵活,可调项更多
点击后会得到下面的图
注意绿色的框,我们出现了.vscode隐藏文件夹,里面就存放着我们的配置文件操作到这不会出现一个名叫c_cpp_properties.json的我文件,这个就是软件帮我们创建好的配置文件末班(JSON的方法也会得到这个文件,使用JSON的方法是微软官方推荐使用的方法)
(5)修改参数
一般修改两个地方就可以使用了,如果你是高手请忽略。
第一个地方:/usr/bin/gcc -> /usr/bin/g++
由于我们调试的是C++程序,所以是不能直接使用gcc编译的(不是不能编译,是不能直接编译),需要调用gcc的外壳封装程序g++(gcc如果要变异C++程序需要外加很多参数,这个具体去看gcc的文档)。
第二个地方:clang-x64 -> gcc-x64
根据上面的提示完成这步
可以修改的地方:其他任何地方都可以根据需求修改,这里只说明修改C和C++的标准
(6)设置好参数后,我们回到你的源文件(本例中的helloworld.cpp)
按下Ctrl+Alt+P调用命令面板,输入task,找到下面的选项
任务:运行任务[Tasks:Run Build Task],点击
点击后,或者直接按下Shift+Ctrl+B进行编译,跳转到下面这个选项栏
根据第2步中配置好的g++,选择C/C++: g++ build active file
这步不能选错,一定要对应!
点击后,我们实际上就完成了我们的编译->链接->生成可执行文件的过程,在你的工作区中会出现一个和源码文件同名的可执行文件(本例中为helloworld)
可以在vscode中新建一个终端,来观察这个可执行文件
(7)再次回到我们的源码文件中,点击F5按键,或者在左侧边栏中的调试(Ctrl+Shift+D)下,在如下的位置中点击绿色的小三角
然后跳转到如下的选项框中
在选择C++(GDB/LLDB)选项之前,先设置好断点
点击后,跳转到另一个选项框
和之前一样根据配置,选择使用g++ build and debug active file
一样,不能选错,要和配置的对应好!
点了这个选项后,我们就真正开始运行和debug程序了
与此同时,我们的工作区中的.vscode文件夹中也发生了变化
会自动生成官方文档中的tasks.json和launch.json文件。
下面的调试控制台会输出调试信息,终端中会输出程序输出的结果。
至此,我们的ubuntu下的debug安装就结束了。如果你不想每次都按照这个步骤来设置,可以将.vscode文件复制到你的新的工作区中(也就是你打开的文件下),就可一直接使用了。
对于以上的操作,Ctrl+Shift+B编译链接生成的步骤可以省略,直接进行下一步就可以。
--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------
- win10下的操作
环境准备
1、安装vscode
2、安装C++ extension for VS Code插件(在vscode的插件库里就能找到)
3、安装Microsoft C++ (MSVC) compiler toolset.
这里有两种获取Microsoft C++ (MSVC) compiler toolset的方法
(1)安装vs(我推荐安装vs2017,简单智能,除了需要网速还要比vs2019稳定,当然安装其他版本理论也行)
(2)或者安装独立工具包在这链接里,Downloads page中vs的web安装工具中在单个组件中查找MSBuild下载(现在都是vs2019了)
4、安装Win10 SDK,这个也是可以在vs的web安装工具中,在单个组件中找到相应的win10 SDK。
5、设置环境变量
计算机->右键属性->高级系统设置->高级->环境变量->用户变量下做如下操作:
(1)path下添加
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64
(2)添加新环境变量LIB
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\lib\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64
(3)添加新环境变量INCLUDE
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um
这是我安装的结果环境变量是这么设置,你的安装环境什么样子相应改一下。
6、安装调试
(1)在开始菜单中找到一个叫Developer Command Prompt for VS 2017(或者2019)的程序,中文叫VS XXXX的开发人员命令提示符
打开后如下图所示
我们不能直接在这个路径下操作,切换到一个可以操作的路径,比如你的用户文档目录
使用命令 cd C:\Users\[你的用户名]\Documents,回车切换
然后新建一个文件夹,你也可以在资源管理器中的对应位置建好后直接打开文件
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
code .命令直接在vscode中打开文件夹(也就是工作区)
(2)在该路径下新建一个名叫helloworld.cpp的文件,贴上代码
//helloworld.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code!"};
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
return 0;
}
之后的操作就和Ubuntu下的基本一致了,与之不同的是省略中间编译的步骤和不用修改第一个.json文件的参数,直接按下F5运行就会完成编译->链接->生成的过程,代码就可以直接调试了。还有要注意的是,如果你的计算机里安装了Git或着MinGw,一定要注意不要使用C++(GDB/LLDB),要使用C++(Windows)
如果你直接使用Ctrl+Shhift+B进行编译链接生成,会报一个错误,这个问题,我没有解决,希望有大佬解决了可以教小弟一下,谢谢。
(3)在完成第一次编译调试之后,你就可以不用再每次都使用VS XXXX的开发人员命令提示符 来启动你的vscode了,因为我们已经得到了我们所需的三个关键文件c_cpp_properties.json、launch.json和tasks.json。实际上,整个编译流程都是依靠这三个文件的,我们获得着三个文件之后,就完成了调试的安装。所以,windows下,们最好是建立一次.vscode的文件结构后,直接拷贝拿来用就可以了。
另外,和Ubuntu下不同的是,输出的结果是在调试控制台输出的,不是在终端。
--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------
关于更多的c_cpp_properties.json、launch.json和tasks.json文件内容的设置,请参考微软的官方文档。
--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------
语文水平有限,如果有哪里有疑问,欢迎评论提问或私聊。
Enjoy it!
--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------
2019.7.29更新
以上的方法只能实现单一文件的编译和调试,如果想要#include 本地自定义的头文件,需要在tasks.json中做一定的修改,Win10和Ubuntu下都是如此
例如:
我的main所在的源码是这样的
//helloworld.cpp
#include <iostream>
#include "printVec.h"
int main()
{
vector<int> ivec{1,2,3,4,5,6,7,8,9};
printVec(ivec);
return 0;
}
这里我定义创建了一个头文件名叫 printVec.h 和 printVec.cpp,其中的代码如下
// printVec.h
#ifndef _PRINTVEC_H_
#define _PRINTVEC_H_
#include <vector>
#include <iostream>
using namespace std;
using std::vector;
void printVec(vector<int>& ivec);
#endif
// printVec.cpp
#include "printVec.h"
void printVec(vector<int>& ivec){
for(auto c : ivec){
cout << c << ' ';
}
cout << endl;
}
函数printVec的作用就是打印vector<int>的全部的值
如果我Ctrl+Shift+B直接编译,会报如下的错误
error LNK2019: 无法解析的外部符号 "void __cdecl printVec(class std::vector<int,class std::allocator<int> > &)" (?printVec@@YAXAEAV?$vector@HV?$allocator@H@std@@@std@@@Z),该符号在函数 main 中被引用
c:\Users\leewwe\Documents\projects\hellowirld\helloworld.exe : fatal error LNK1120: 1 个无法解析的外部命令
终端进程已终止,退出代码: 2
这段话的意思是,链接器找不到引用的printVec函数的定义,无法完成链接。
问题出在哪里呢?
打开tasks.json文件
// Win10
{
"tasks": [
{
"type": "shell",
"label": "cl.exe build active file",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}""
]
}
],
"version": "2.0.0"
}
// Ubuntu
{
"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"
]
}
]
}
注意那个 "args" 的参数,这些是什么呢?实际就是我们传输给编译器的编译参数,告诉编译器什么编译等级,输入文件在哪里,输出文件在输出到哪里。
当你按下Ctrl+Shift+B
Win10下等同于 cl.exe /Zi /EHsc /Fe: helloworld.exe helloworld.cpp
Ubuntui下等同于 g++ -g helloworld.cpp -o helloworld
看到这里我想很多同学应该已经明白了,"args"参数中之传入了之前的单个文件,我们根本就没有告诉编译器还有一个文件也要编译,因此链接的时候就会出错。
需要做的修改就是在tasks.json文件中的"args"参数下添加我们要编译的文件
// Win10
"args": [
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}",
"${workspaceFolder}\\printVec.cpp"
]
// Ubuntu
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"${workspaceFolder}/printVec.cpp"
],
这个时候,你就可以使用重新编译了,理论上是可以成功的,但是我在Win10下需要重启VScode一次,在wsl和Ubuntu下重启了系统才能用。
对于多进程程序的调试,Ubuntu下需要安装根据编译提示,需要安装env
在Ubuntu18.04下
sudo apt-get install env2
参考文档:
1、https://blog.csdn.net/fise19/article/details/82142712 环境变量的设置