从VSCode
转到Clion
,再到Xcode
,再到VSCode
,我可太难了。。。
基于g++命令
单文件编译
在写好代码之后,找到VSCode
的菜单栏的终端,新建一个终端,之后我们就可以在终端中对所编写的代码进行编译操作了:
可以看到g++
编译之后会生成一个a.exe
文件,这里生成的a.exe
文件是不包含调试信息的。并且我们可以将其命名为别的名字。通过参数控制。g++
编译单文件,生成带调试信息的可执行文件、并调式:
g++ -g .\main.cpp -o my_swap • 1
- g
参数代表生成带调试信息的可执行文件,- o
表示指定输出文件名。只有生成的是带调试信息的可执行文件,才可以被调试。
如果需要调试代码,需要去选择创建launch.json
文件。步骤如下:1. 选中最左侧的运行和调试按钮。2. 点击create a launch.json file
。3. 选择C++(GDB/LLDB)
(因为我们选择gcc
软件里面的gdb
调试工具)。4. 选择g++.exe-生成和调试活动文件
。
之后就会生成launch.json
文件,并进入调试。并且会给你生成一个与main.cpp同名的main.exe文件,也就是说编译器帮助我们做了很多事情。
在launch.json
文件中,最为关键的两条信息就是"program":
和"preLaunchTask":
:
"program":
代表的是需要调试的可执行文件。想要对一个可执行文件进行调试,首先需要去生成这个可执行文件。"preLaunchTask":
表示的是调试之前需要做的工作,其实就是要去生成调试需要的可执行文件。这个生成文件的配置工作在tasks.json
文件中:
多文件编译
把swap
函数放到一个头文件中声明,和一个.cpp
文件中去实现。
g++
编译多文件,生成带调试信息的可执行文件、并调试:
g++ -g .\main.cpp .\swap.cpp -o my_multi_swap • 1
此时如果和单个文件一样,去调试的话,就会报错:preLaunchTask"C/C+ +: g+ +.exe生成活动文件"已终止,退出代码为-1.
这是因为,想要调试多个文件,我们需要自己去配置launch.json
文件和tasks.json
文件。因为我们已近生成了my_multi_swap.exe
文件,所以我们直接配置"program":
所指定的路径即可:
此时就能进入调试了。
在配置单个文件的时候,VSCode
都帮助我们做了生成可调试文件的工作。如果是需要编译多个文件我们需要使用g++
手动编译一下,生成我们所需要的exe
文件,然后修改launch.json
文件,将生成的exe
文件路径添加进来。
基于cmake
cmake
是一款非常好的工具,它可以帮助我们生成makefile
,makefile
是什么呢?如果我们需要编译一个大型的工程的话,它会帮助我们指定编译规则,但是它的makefile
书写起来非常地困难。所以cmake
这个工具就产生了,它能够帮助我们生成极为复杂的makefile
。
如果想要将我们的工程构建为cmake工程的话,我们需要在文件主目录里面创建CMakeLists.txt
编写最简单的CMakeLists.txt
(安装cmake
插件后会有智能提示):
project(MYSWAP) add_executable(my_cmake_swap main.cpp swap.cpp)
MYSWAP
是工程名字,add_executable
有两个参数,my_cmake_swap
表示生成的可执行文件的名字,通过main.cpp swap.cpp
这两个文件生成。ctrl shit p
进入配置,输入cmake
,选择下图中的第一个CMake:Configure
,之后在选择GCC
后面接自己的版本号的那一个即可:
点击完之后会生成一个build
文件夹,是cmake
进行外部构建的一个build
文件夹。
想要通过CMakeLists.txt
生成可执行文件,我们需要在终端中输入一些指令。我们需要进入刚刚生成的build
文件夹下,输入cmake ..
看到上述红色方框中出现的显示,说明说有的步骤都是正常的。之后需要输入make
命令,但是windows
下的make
和linux
下的make
名字可能不一样:
building
是把两个cpp
编译成二进制文件,linking
是把exe
连接起来。
想要拿到刚刚生成的文件进行调试的话,我们同样需要去配置launch.json
文件即可:
更多参考:
mkdir build
cd build
如果电脑上已经安装了vs,可能会调用微软MSVC编译器,使用(cmake -G “MinGW Makefiles” …)代替cmake …即可
仅第一次使用cmake时使用(cmake -G “MinGw Makefiles” …) 后面可使用(cmake …)
cmake …
ming32-make.exe // 或者是make
配置json
launch.json
- launch.json : for debug
代码改动之后,我们需要重新生成可执行文件,然后调试,但是我们如果一直在终端里面去生成可执行文件的话,效率就太低了。因为代码改动一次,就需要去重新生成一次可执行文件。因此我们需要将preLaunchTask
打开(删除注释//),并配置其相关信息:
ctrl shift p
,输入task
,选择config task
可以进行模板创建:
或者选中代码区域,右键去生成和调试活动文件。
tasks.json
- tasks.json : for build before debug
g++
编译方式配置tasks.json
:
command
的含义就是g++
,之后带两个文件的参数,然后是输出文件的路径,直接给绝对路径是最保险的:
或者使用相对路径:
附上launch.json
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "g++.exe - 生成和调试活动文件", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/out.exe", "args": [], "stopAtEntry": false, "cwd": "D:\\install_hezhiqiang\\MinGW\\bin", "environment": [], "externalConsole": true, // "console": "externalTerminal", "MIMode": "gdb", "miDebuggerPath": "D:\\install_hezhiqiang\\MinGW\\bin\\gdb.exe", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "C/C++: g++.exe 生成活动文件" } ] }
附上tasks.json
:
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: g++.exe 生成活动文件", "command": "D:\\install_hezhiqiang\\MinGW\\bin\\g++.exe", "args": [ "-g", "${workspaceFolder}\\main.cpp", "${workspaceFolder}\\swap.cpp", "-o", "${workspaceFolder}\\out.exe" ], "options": { "cwd": "D:\\install_hezhiqiang\\MinGW\\bin" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "调试器生成的任务。" } ], "version": "2.0.0" }
cmake
方式配置tasks.json
:
如果是cmake
工程的话,想用task.json
执行cmake
的编译命令呢?task.json
可以帮助我们去完成调试之前的编译工作,将其编译命令对应到task.json
里面如下:
附上launch.json
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "g++.exe - 生成和调试活动文件", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/my_cmake_swap.exe", "args": [], "stopAtEntry": false, "cwd": "D:\\install_hezhiqiang\\MinGW\\bin", "environment": [], "externalConsole": true, // "console": "externalTerminal", "MIMode": "gdb", "miDebuggerPath": "D:\\install_hezhiqiang\\MinGW\\bin\\gdb.exe", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "Build" } ] }
这里要注意"program": "${workspaceFolder}/build/my_cmake_swap.exe"
是
附上tasks.json
:
{ "version": "2.0.0", "options": { "cwd": "${workspaceFolder}/build" }, "tasks": [ { "type": "shell", "label": "cmake", "command": "cmake", "args": [ ".." ] }, { "label": "make", "group":{ "kind": "build", "isDefault": true }, "command": "make", "args": [ ] }, { "label": "Build", "dependsOn":[ "cmake", "make" ] } ] }
最后推荐大家使用cmake
方式构建工程。