1--Debug版本和Release版本
区别:
①Debug版本称为调试版本,其包含调试信息,编译过程中不进行优化,便于调试;
②Release版本成为发布版本,编译过程中会进行优化,执行更高效。
g++针对上述两个版本提供了不同的指令:
①Debug版本:
g++ say_hi.cpp -o say_hi.out -W -Wall -g -std=c++17
g++ <filename>.cpp <other_cpp_files> -o <filename>.out -W -Wall -g -std=c++17
②Release版本:
g++ say_hi.cpp -o say_hi.out -W -Wall -O2 -std=c++17
g++ <filename>.cpp <other_cpp_files> -o <filename>.out -W -Wall -O2 -std=c++17
解释上述参数的意义:
①<filename>.cpp: 要编译的.cpp文件;
②<other_cpp_files>: 链接的.cpp文件;
③-o <filename>.out: 编译好的执行文件;
④-W -Wall: 错误信息提示;
⑤-g: 开启调试选项(即Debug版本);
⑥-O2: 开启编译优化(即Release版本);
⑦-std: 采用的C++标准;
2--tasks.json和launch.json
①tasks.json配置文件:
{
"version": "2.0.0", // 配置文件的版本
"tasks": [
// task1
{
"label": "g++ compile", // task1任务的别名
"type": "shell",// shell or process
"command": "g++", // 任务要执行的command,C++为g++,C为gcc
"args": [ // g++命令的参数
"${file}", // 当前打开的文件,表示当前要编译的文件(绝对路径)
// 在这里添加你还需要链接的.cpp文件
//"hello.cpp",
"test.cpp", // hello.cpp需要引用test.cpp中的函数
"-o", //
// fileDirname: 当前打开文件的目录名
// fileBasenameNoExtension: 当前打开文件的基本名称(不带文件扩展名)
"${fileDirname}/${fileBasenameNoExtension}.out",
"-W", // g++ 错误信息提示
"-Wall",
"-g", // g++开启调试选项
"-std=c++17", // g++采用的C++标准
],
"group": {
"kind": "build",
"isDefault": true, // 在本group中是否为默认任务
},
"presentation": {
"echo": true, // 打开可以看到编译的命令,把命令本身输出一次
"reveal": "silent", // 控制在集成终端中是否显示。如果没问题那我不希望终端被切换、如果有问题我希望能看到编译过程哪里出错,所以选silent(可能always会好一些)
"focus": false, // 是否将鼠标移过去。因为是编译任务,不需要输入什么东西,所以设置为false
"panel": "shared", // shared:不同任务的输出使用同一个终端panel
"showReuseMessage": true, // 默认输出一句话,输出就true,否则就false
"clear": false, // 是否保留之前任务的输出信息
},
"options": {
"cwd": "${workspaceFolder}", // 默认
},
// problemMatcher: 用正则表达式提取g++的输出中的错误信息并将其显示到VS Code下方的Problems窗口
// 保持默认就好
"problemMatcher": {
"owner": "cpp",
"fileLocation": "absolute",
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5,
},
},
},
// task2
{
"label": "Open Terminal.app",
"type": "shell",
"command": "osascript -e 'tell application \"Terminal\"\ndo script \"echo now VS Code is able to open Terminal.app\"\nend tell'",
"problemMatcher": [],
"group": "none",
}
]
}
注:上述配置文件中,主程序main()在hello.cpp中,hello.cpp将引用test.cpp中的函数。根据个人习惯,也可以进行以下修改:注释掉"${file}",解除注释"hello.cpp",即指明要编译的两个.cpp文件。上述的tasks.json文件,需要打开hello.cpp,在hello.cpp的展示页面上进行编译运行,否则会报错,所以更建议注释掉"${file}",指明要编译的所有.cpp文件。
②launch.json配置文件
{
"version": "0.2.0",
"configurations": [
{
"type": "cppdbg", // C++ debug
// 若debug的时候,项目已启动,则设置为attach
// 若debug和启动项目的时机相同,则设置为launch
"request": "launch", // debug的类型,launch表示启动,attach表示附加
"name": "C++ Debug", // 在VSCode侧边栏Run那里显示的名称(人为设定)
"preLaunchTask": "g++ compile", // 在debug之前要进行的任务即compile,需与tasks.json中编译任务的label相同
"program": "${fileDirname}/${fileBasenameNoExtension}.out", // debug的对象(-g编译出来的二进制文件),需与.vscode/tasks.json中生成的可执行文件一致
"args": [], // 运行可执行程序需要添加的输入参数(argc/argv)
"environment": [], // 放置环境变量
"cwd": "${workspaceFolder}", // 当前工作目录
"stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main中打断点
"externalConsole": true, // 是否使用额外的终端,否则使用内置终端
"MIMode": "lldb", // 指定连接的调试器,gdb或lldb
}
]
}
注:在Windows或Linux系统下,往往不需要使用额外的终端,即"externalConsole"设置为false,而在Mac系统下需要使用额外的终端,所以要设置为true。
3--相对路径./和../
A
├─ B
│ ├─ b1
│ ├─ b2
│ └─ b3
└─ b4
└─ C
├─ c1
├─ c2
├─ c3
①b1引用b2,只需要直接引用对应的文件名即可,或./b2;
②b1引用b4,需要使用./b3/b4的相对路径;
③b1引用c1,需要使用../C/c1的相对路径;
④b4引用c1,需要使用.../C/c1的相对路径;