@@ -0,0 +1,233 @@ | |||||
# IAR相关知识点 | |||||
## 工程操作 | |||||
### 各类型文件含义 | |||||
- **.eww**:Embedded Workbench Workspace(嵌入式工作台工作空间文件) | |||||
用于管理多个工程(.ewp 文件)的集合,记录工程的组织方式和打开状态。 | |||||
- **.ewp**:Embedded Workbench Project(嵌入式工作台工程文件) | |||||
是 IAR 项目的核心文件,包含工程的配置信息(如编译选项、目标芯片、文件列表等)。 | |||||
- **.ewd**:Embedded Workbench Debugger Configuration(嵌入式工作台调试器配置文件) | |||||
存储调试相关的设置,如断点、监视变量、调试器连接参数等。 | |||||
- **.c**:C Source File(C 语言源文件) | |||||
通用的 C 语言源代码文件,并非 IAR 专属,所有 C 语言开发环境均可识别。 | |||||
- **.dep**:Dependency File(依赖文件) | |||||
记录源文件之间的依赖关系(如头文件引用),用于编译系统判断文件是否需要重新编译。 | |||||
- **.ewt**:Embedded Workbench Template(嵌入式工作台模板文件) | |||||
用于存储工程或文件的模板配置,方便快速创建具有相同设置的新项目。 | |||||
- **.s** 或 **.asm**:Assembly Source File(汇编源文件) | |||||
包含汇编语言代码,用于编写对性能要求极高或直接操作硬件的程序段。 | |||||
- **.h**:Header File(头文件) | |||||
存储函数原型、宏定义和类型声明,用于在多个源文件间共享接口定义。 | |||||
- **.out**:Output File(输出文件) | |||||
编译链接后生成的中间文件,通常包含可执行代码和符号信息,可用于进一步处理。 | |||||
### 新建/打开工作区 | |||||
 | |||||
### 新建/打开工程 | |||||
 | |||||
### 工作区中导入/添加工程 | |||||
 | |||||
### 新建分组 | |||||
 | |||||
### 新建/打开文件 | |||||
 | |||||
### 工程目录与文件目录的关系 | |||||
工程目录就是像linux里面的软连接,实际文件还是存在他自己的地方, | |||||
## 工程配置 | |||||
在工程文件中选择右键 选择`options`->`General options`->`target`->`Device`选择自己电脑所用的架构 | |||||
 | |||||
## 编译配置 | |||||
### 优化等级 | |||||
选择上述图片里面的`C/C++ Compiler`->`Optimizations` [说明地址](https://www.bmrtech.com/Tech/tech_show/50.html) | |||||
 | |||||
### 硬件浮点 | |||||
 | |||||
### 预处理 | |||||
选择`options`->`C/C++ Compiler`->`preprocessor` | |||||
 | |||||
### 链接文件 | |||||
选择`options`->`Linker`->`linker configuration file` 链接脚本控制内存分配(Flash/ROM、RAM 布局)关键硬件相关文件 | |||||
 | |||||
### 文件路径配置 | |||||
选择`options`->`C/C++ Compiler`->`preprocessor` | |||||
 | |||||
### 输出文件配置 | |||||
选择`options`->`Output Converter`选择生成的文件格式和文件名称 | |||||
 | |||||
### 输出文件路径配置 | |||||
点击`options`>`General Optons`>`Output` | |||||
 | |||||
## 调试器配置 | |||||
选择`options`->`Debugger`选择要烧录进单片机的方式 | |||||
 | |||||
## 库相关配置 | |||||
`options`->`General options`->`Liabrary Configuration` | |||||
 | |||||
## 静态库的封装 | |||||
创建一个项目,编写好函数,右键项目`options`->`General options`->`Output`选择生成的文件是Library | |||||
 | |||||
2. 如果要屏蔽不想生成的文件可以把`Exclude from build` | |||||
 | |||||
3. 选择生成的路径 | |||||
 | |||||
4. 编译生成 | |||||
 | |||||
## 静态库的调用 | |||||
1. 配置静态库的路径 | |||||
点击`Options`>`Linker `选择静态库的路径 | |||||
 | |||||
2. 编写代码验证 | |||||
 | |||||
## 工程调试 | |||||
### 断点 | |||||
#### 设置断点,删除断点 | |||||
在侧边栏直接点一下出现红点即代表添加断点成功,再点一点即可取消断点 | |||||
 | |||||
#### 禁用断点,启用断点 | |||||
左键断点选择`Enable/disable Breakpoint` | |||||
 | |||||
#### 条件断点 | |||||
右键断点选中`Edit Breakpoint` | |||||
 | |||||
设置i == 5触发断点 | |||||
 | |||||
当i == 5时命中断点 | |||||
 | |||||
### 监控信息 | |||||
点击`View`>`Watch` | |||||
 | |||||
### 寄存器信息 | |||||
点击`View`>`Register` | |||||
 | |||||
### 内存信息 | |||||
点击`View`>`Memory` | |||||
 | |||||
### 栈信息 | |||||
点击`View`>`Stack` | |||||
 | |||||
### 汇编信息 | |||||
点击`View`>`Disassembly` | |||||
 | |||||
### 调用堆栈信息 | |||||
点击`View`>`Call Stack` | |||||
 | |||||
 | |||||
### 单步调试 | |||||
#### 逐过程 | |||||
 | |||||
#### 逐语句 | |||||
 | |||||
#### 复位 | |||||
 | |||||
#### 跳出 | |||||
 | |||||
@@ -0,0 +1,281 @@ | |||||
# 库相关知识点 | |||||
## 静态库 | |||||
### 静态库的基本概念 | |||||
静态库(Static Library)是一种预先编译好的程序代码集合,以独立文件形式存在,供其他程序在编译时链接使用。它将多个目标文件(.o 或 .obj)打包为单一文件,简化了程序开发和部署流程。 | |||||
### 核心特点 | |||||
1. **编译时链接** | |||||
链接器在编译阶段将静态库中的代码完整复制到可执行文件中,运行时无需依赖外部库文件。 | |||||
2. **独立性** | |||||
生成的可执行文件不依赖外部库,便于在不同环境中部署,但会导致文件体积增大。 | |||||
3. **格式差异** | |||||
- **Windows**:通常以 `.lib` 为扩展名 | |||||
- **Unix/Linux/macOS**:使用 `.a`(archive)扩展名 | |||||
### 静态库的生成 | |||||
使用vs2022选择`C++`的`静态库`创建 | |||||
 | |||||
写完代码,点击生成即可生产`.lab`文件 | |||||
 | |||||
 | |||||
### 静态库的调用 | |||||
#### 在工程配置中调用 | |||||
1. 配置静态库的头文件选择`属性`>`C/C++`>`附加包含目录`将头文件目录配置上去 | |||||
 | |||||
2. 配置静态库的所在位置,选择`属性`>`链接器`>`常规`>`附加库目录`配置其所在路径 | |||||
 | |||||
3. 配置静态库的所在位置,选择`属性`>`链接器`>`输入`>`附加依赖项`配置其名字 | |||||
 | |||||
4. 可以直接使用`#include <StaticLib.h>` | |||||
 | |||||
#### 在代码中语句加载lib调用 | |||||
先把需要引用的头文件还有`.lib`文件放在一起 | |||||
```C++ | |||||
//第一行是引用头文件 | |||||
//第二行是引用静态库 | |||||
#include "C:\\Users\\徐加冠\\source\\repos\\LabTest\\x64\\Debug\\StaticLib.h" | |||||
#pragma comment(lib,"C:\\Users\\徐加冠\\source\\repos\\LabTest\\x64\\Debug\\StaticLib.lib") | |||||
``` | |||||
 | |||||
## 动态库 | |||||
### 动态库的基本概念 | |||||
动态库(Dynamic Library)是一种在程序运行时才被链接和加载的共享库文件,包含可被多个程序同时使用的代码和数据。与静态库(Static Library)在编译时被完整嵌入到可执行文件中不同,动态库在运行时才被动态加载到内存,实现代码复用并减少内存占用。 | |||||
### 核心特点 | |||||
1. **共享加载**:多个程序可共享同一份动态库实例,减少内存开销。 | |||||
2. **运行时链接**:程序启动时才加载动态库,而非编译时,提高开发灵活性。 | |||||
3. **独立更新**:动态库可独立于程序更新,无需重新编译整个程序。 | |||||
4. 跨平台差异: | |||||
- Windows:以 `.dll`(Dynamic Link Library)为扩展名。 | |||||
- Linux/macOS:以 `.so`(Shared Object)或 `.dylib`(Dynamic Library)为扩展名。 | |||||
### 动态库的生成 | |||||
#### 通过导出语句生成 | |||||
1. 使用vs2022选择动态链接库创建空项目 | |||||
 | |||||
2. 分别添加头文件和源文件 | |||||
头文件的导出语句 | |||||
```C++ | |||||
#pragma once | |||||
#ifndef BHDLL_d | |||||
#define BHDLL_d | |||||
//宏定义导出 | |||||
#ifdef BHDLL__//如果没有定义DLLH 就定义 DLLH __declspec(dllexport) | |||||
#define BHDLL __declspec(dllexport)//导出 | |||||
#else | |||||
#define BHDLL __declspec(dllimport)//导入 | |||||
#endif // DLLH__//如果没有定义DLLH 就定义 DLLH | |||||
//编写代码区域 | |||||
//导出函数 | |||||
BHDLL int add(int a, int b); | |||||
BHDLL int sub(int a, int b); | |||||
//导出类 | |||||
class BHDLL dllH | |||||
{ | |||||
public: | |||||
int mul(int a, int b); | |||||
int div(int a, int b); | |||||
}; | |||||
//以C语言方式导出函数: | |||||
extern "C" | |||||
{ | |||||
BHDLL int Cadd(int a, int b); | |||||
BHDLL int Csub(int a, int b); | |||||
} | |||||
#endif | |||||
``` | |||||
源文件代码 | |||||
```C++ | |||||
#include "BH_dll.h" | |||||
#include <iostream> | |||||
using namespace std; | |||||
int add(int a, int b) | |||||
{ | |||||
return a + b; | |||||
} | |||||
int sub(int a, int b) | |||||
{ | |||||
return a - b; | |||||
} | |||||
int dllH::mul(int a, int b) | |||||
{ | |||||
return a * b; | |||||
} | |||||
int dllH::div(int a, int b) | |||||
{ | |||||
return a / b; | |||||
} | |||||
int Cadd(int a, int b) | |||||
{ | |||||
return a + b; | |||||
} | |||||
int Csub(int a, int b) | |||||
{ | |||||
return a - b; | |||||
} | |||||
``` | |||||
3. 修改项目属性改为dll动态库 | |||||
 | |||||
点击重新生成,即可生成动态链接库 | |||||
 | |||||
#### 通过模块文件生成 | |||||
1. 使用vs2022创建一个空项目 | |||||
 | |||||
2. 创建一个源文件 | |||||
```C++ | |||||
#include "iostream" | |||||
void fun1() | |||||
{ | |||||
std::cout << "fun1" << std::endl; | |||||
} | |||||
void fun2() | |||||
{ | |||||
std::cout << "fun2" << std::endl; | |||||
} | |||||
``` | |||||
3. 创建一个edf配置文件 | |||||
```edf | |||||
LIBRARY "test" | |||||
EXPORTS | |||||
fun1 | |||||
fun2 | |||||
``` | |||||
4. 修改项目的生成为.dll和输出的名字和上面`LIBRARY "test"`定义的名字要一致 | |||||
 | |||||
5. 定义模块文件的位置点击`链接器`>`输入`>`模块定义文件` | |||||
 | |||||
6. 点击重新生成就可以生成 | |||||
 | |||||
### 动态库的调用 | |||||
#### 在工程配置中调用 | |||||
1. 点击项目属性配置其`C\C++`>`附加包含目录`,改成需要调用dll所在目录 | |||||
 | |||||
2. 点击`链接器`>`常规`>`附加库目录` | |||||
 | |||||
3. 点击`链接器`>`输入`>`附加依赖项`输入调用名字 | |||||
 | |||||
4. 运行代码时需要把dll放在exe同文件夹下,不然会报错 | |||||
 | |||||
5. 放在相同目录下运行成功 | |||||
 | |||||
#### 在代码中语句加载lib调用 | |||||
```C++ | |||||
#include "D:\\桌面\\x64\\Debug\\DllMy.h" | |||||
#pragma comment(lib,"D:\\桌面\\x64\\Debug\\DllMy.lib") | |||||
``` | |||||
 | |||||
#### 在代码中语句加载dll调用 | |||||
```C++ | |||||
HINSTANCE Dll = LoadLibrary(L"test.dll"); | |||||
if (Dll == NULL) { | |||||
std::cerr << "无法加载DLL! 错误码: " << GetLastError() << std::endl; | |||||
return 1; | |||||
} | |||||
typedef void (*Func)(); // 定义函数指针类型 | |||||
Func add = (Func)GetProcAddress(Dll, "fun1"); | |||||
add(); | |||||
FreeLibrary(Dll); | |||||
return 0; | |||||
``` | |||||
 | |||||
ps:如果使用导出语句生成的dll,dll内部的函数名称和你定义的不一样,如果使用edf文件导出可以自定义函数名称 | |||||
@@ -0,0 +1,290 @@ | |||||
<a id ="top"></a> | |||||
# Markdown相关知识点 | |||||
# 标题相关 | |||||
一级标题为1个# | |||||
二级标题为2个# | |||||
三级标题为3个# | |||||
例子: | |||||
# 这是一级标题 | |||||
## 这是二级标题 | |||||
### 这是三级标题 | |||||
# 标号相关 | |||||
## 无序标号 | |||||
*/+/- + 空格 + 标题 | |||||
* Part A | |||||
+ Part B | |||||
- Part C | |||||
## 有序标号 | |||||
数字 + 英文句号 + 空格 + 标题 | |||||
1. Part A | |||||
2. Part B | |||||
3. Part C | |||||
## 标号嵌套 | |||||
回车之后按一个tab | |||||
### 有序嵌套有序 | |||||
1. Part A | |||||
2. Part B | |||||
1. part B.A | |||||
2. Part B.B | |||||
3. Part C | |||||
1. Part C.A | |||||
2. Part C.B | |||||
1. Part C.B.A | |||||
2. Part C.B.B | |||||
4. Part D | |||||
### 无序嵌套无序 | |||||
* 水果 | |||||
* 苹果 | |||||
* 香蕉 | |||||
* 西瓜 | |||||
* 蔬菜 | |||||
* 根茎类 | |||||
* 土豆 | |||||
* 马铃薯 | |||||
* 胡萝卜 | |||||
* 叶子类 | |||||
* 芹菜 | |||||
* 菠菜 | |||||
* 青菜 | |||||
### 有序嵌套无序 | |||||
1. 一级标题 | |||||
2. 二级标题 | |||||
* 子项 1 | |||||
* 子项 2 | |||||
1. 子子项 1 | |||||
+ 子子项 2 | |||||
3. 三级标题 | |||||
4. 四级标题 | |||||
# 文字相关 | |||||
## 加粗 | |||||
格式为 *\*加粗的信息** 两个星号包裹起来 | |||||
这个是**加粗的信息** | |||||
## 倾斜 | |||||
格式为\*倾斜的信息\* 一个星号包裹起来 | |||||
这个是*倾斜的信息* | |||||
## 加粗和倾斜 | |||||
格式为\*\*\*倾斜的信息\*\*\* 三个个星号包裹起来 | |||||
这个是***加粗和倾斜的信息*** | |||||
# <a id="target-section">代码块</a> | |||||
## 单行代码块 | |||||
使用反引号(`)将代码包围起来。 | |||||
这是一个示例代码`Console.Write("Hello, world");` | |||||
## 多行代码块 | |||||
- 用三个反引号(\`\`\`)包裹代码,可在起始符号后指定编程语言(如`C#`)以开启语法高亮。 | |||||
```C# | |||||
using System; | |||||
namespace HelloWorld | |||||
{ | |||||
class Program | |||||
{ | |||||
static void Main(string[] args) | |||||
{ | |||||
Console.WriteLine("Hello, World!"); | |||||
} | |||||
} | |||||
} | |||||
``` | |||||
# 超链接 | |||||
## 文字超链接 | |||||
* 行内式超链接 | |||||
语法格式为`[链接文本](链接地址)`。 | |||||
这是一个示例[百度](https://www.baidu.com) | |||||
* 参考式超链接 | |||||
另外一种格式`[链接文本](链接地址)` 后面在定义一个`[链接标识符]: 链接地址` | |||||
先定义[tencent - cloud]: https://cloud.tencent.com 这个定义可以定义在任何地方 | |||||
在使用 | |||||
[腾讯云][tencent - cloud] | |||||
* 自动链接 | |||||
直接使用尖括号`<>`包裹 URL, | |||||
百度网址<https://www.baidu.com> | |||||
## 图片超链接 | |||||
格式为`[](跳转的地址)` | |||||
[](https://markdown-here.com/) | |||||
## 页面内跳转 | |||||
**使用 HTML 锚点标签**:在跳转目标位置添加 HTML 标签并设置`id`属性,例如`<h2 id="target - section">目标章节</h2>`。然后在跳转链接处使用`href`指向这个`id`,链接格式为`[跳转到目标章节](#target - section)`。渲染成 HTML 后,点击 “跳转到目标章节” 就会跳转到相应标题处。 | |||||
[点击跳转到目标章节](#target-section) | |||||
[回到顶部](#top) | |||||
**直接定义**:语法 `[文字描述](#跳转的标题)` | |||||
[标号嵌套](#标号嵌套) | |||||
# 其他 | |||||
## 分割线 | |||||
- 用三个或以上的 `-`(短横线)、`*`(星号)或 `+`(加号),并单独占一行。 | |||||
*** | |||||
--- | |||||
+++ | |||||
___ | |||||
## 图片 | |||||
格式为`` | |||||
* 本地地址 | |||||
 | |||||
* 远程地址 | |||||
 | |||||
## 表格 | |||||
```md | |||||
| 表头 | 表头 | | |||||
| ---- | ---- | | |||||
| 单元格 | 单元格 | | |||||
| 单元格 | 单元格 | | |||||
| 左对齐 | 右对齐 | 居中对齐 | | |||||
| :-----| ----: | :----: | | |||||
| 单元格 | 单元格 | 单元格 | | |||||
| 单元格 | 单元格 | 单元格 | | |||||
``` | |||||
| 表头1 | 表头2 | 表头三 | | |||||
| :----: | :----: | :----: | | |||||
| 单元格 | 单元格 | 单元格 | | |||||
| 单元格 | 单元格 | 单元格 | | |||||
## 引用 | |||||
引用使用`>`+ 你要引用的话 | |||||
> 这是一行引用 | |||||
多行引用直接依次书写,也可以引用图片,代码块,等等 | |||||
> 这是引用 | |||||
> | |||||
> ```C# | |||||
> //引用代码块 | |||||
> Console.WriteLine("Hello, World!"); | |||||
> ``` | |||||
> | |||||
> * 标题一 | |||||
> * 标题二 | |||||
> * 标题三 | |||||
# 路径 | |||||
## 相对路径 | |||||
就是直接根据当前md文件所在的目录开始 | |||||
例子`./assets/icon256.png`; | |||||
 | |||||
## 绝对路径 | |||||
就是直接从C盘或者D盘开始 | |||||
例子 | |||||
 |
@@ -0,0 +1,68 @@ | |||||
# SourceInSight相关知识点 | |||||
## 常规操作 | |||||
### 工程新建/添加 | |||||
点击`project`->`new progect` 第一个选择项目名称,第二个选择需要导入的代码目录 | |||||
 | |||||
### 文件新建/添加 | |||||
当创建一个工程的时候,让你选择添加到文件,选中想加入的文件夹,点击`Add Tree` | |||||
 | |||||
添加完文件点击这个小书 | |||||
 | |||||
 | |||||
### 符号表同步 | |||||
 | |||||
### 视图切换 | |||||
点击 `Window`>`Arrange Windows`>`Tile One Window`和two可以切换两个视图 | |||||
 | |||||
### 常用窗口打开/关闭 | |||||
上面三个按钮依次代表 | |||||
* Project Window 窗口 右侧 查看我们的工程所在文件夹以及文件夹下的文件 | |||||
* Symbol Window 窗口左侧 用于查看我们开启的文件以及文件内所包含的函数 | |||||
* Context Window窗口 左下 用于查看,函数中某个参数与函数的关系 | |||||
* Relation Window窗口 右下 用于查看函数以及参数所定义的位置 | |||||
 | |||||
### 搜索引用 | |||||
1. 模糊查找 | |||||
符号包括:函数、宏、数据类型等 | |||||
1、查找本文件的符号 | |||||
2、查找项目文件 | |||||
3、查找项目符号 | |||||
4、文件目录 | |||||
 | |||||
2. 精确查找 | |||||
`Search`->`Lookup References` 引用查找 | |||||
 | |||||
3. 当前文件查找 | |||||
`Search`->`Search` 在当前文件查找 | |||||
 |
@@ -0,0 +1,100 @@ | |||||
# 单元测试相关知识点 | |||||
## 单元测试 | |||||
### 单元测试创建 | |||||
打开vs2022选择`C++`的`测试`选择第一个`本机单元测试项目` | |||||
 | |||||
ps:怎么添加一个项目到单元测试 在单元测试的时候需要添加现有项选择`obj`文件就能链接成功 | |||||
 | |||||
### 代码覆盖度 | |||||
代码覆盖就是测试代码的每一条语句都要执行到,确保不发生错误 | |||||
下面是编写的测试代码 | |||||
 | |||||
以下是测试代码 | |||||
 | |||||
### 运行性能 | |||||
### 测试样例书写 | |||||
1. 需要测试的代码 | |||||
```C++ | |||||
double MathLibrary::Divide(double a, double b) { | |||||
if (b != 0) return a / b; | |||||
return 0.0; | |||||
} | |||||
bool MathLibrary::IsPositive(int n) { | |||||
return n >= 0; | |||||
} | |||||
bool MathLibrary::CheckRange(int a, int b) { | |||||
return (a > 0) && (b < 10); | |||||
} | |||||
double MathLibrary::CalculateDiscount(int age, bool isMember) { | |||||
if (age < 18) | |||||
return isMember ? 0.25 : 0.20; | |||||
else | |||||
return isMember ? 0.15 : 0.10; | |||||
} | |||||
``` | |||||
2. 以下时测试样例的书写 | |||||
```C++ | |||||
#include "pch.h" | |||||
#include "CppUnitTest.h" | |||||
#include "MathLibrary.h" | |||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework; | |||||
namespace UnitTestDemo | |||||
{ | |||||
TEST_CLASS(UnitTestDemo) | |||||
{ | |||||
public: | |||||
// 语句覆盖 | |||||
TEST_METHOD(Divide_ZeroDivisor1) { Assert::AreEqual(0.0, MathLibrary::Divide(4, 0)); } | |||||
TEST_METHOD(Divide_ZeroDivisor2) { Assert::AreEqual(0.0, MathLibrary::Divide(4, 0)); } | |||||
// 分支覆盖 | |||||
TEST_METHOD(IsPositive_Positive1) { Assert::IsTrue(MathLibrary::IsPositive(5)); } | |||||
TEST_METHOD(IsPositive_Negative2) { Assert::IsFalse(MathLibrary::IsPositive(-5)); } | |||||
// 条件覆盖 | |||||
TEST_METHOD(CheckRange_BothTrue1) { Assert::IsTrue(MathLibrary::CheckRange(5, 5)); } | |||||
TEST_METHOD(CheckRange_FirstFalse2) { Assert::IsFalse(MathLibrary::CheckRange(-5, 5)); } | |||||
TEST_METHOD(CheckRange_SecondFalse3) { Assert::IsFalse(MathLibrary::CheckRange(5, 15)); } | |||||
// 路径覆盖 | |||||
TEST_METHOD(Discount_TeenMember1) { Assert::AreEqual(0.25, MathLibrary::CalculateDiscount(15, true)); } | |||||
TEST_METHOD(Discount_TeenNonMember2) { Assert::AreEqual(0.20, MathLibrary::CalculateDiscount(15, false)); } | |||||
TEST_METHOD(Discount_AdultMember3) { Assert::AreEqual(0.15, MathLibrary::CalculateDiscount(20, true)); } | |||||
TEST_METHOD(Discount_AdultNonMember4) { Assert::AreEqual(0.10, MathLibrary::CalculateDiscount(20, false)); } | |||||
}; | |||||
} | |||||
``` | |||||
### 单元测试的调试 | |||||
在需要调试的位置打上断点,右键点击`调试测试` | |||||
 | |||||
 |
@@ -0,0 +1,240 @@ | |||||
# VisualStudio相关知识点 | |||||
## 工程创建 | |||||
### 工程相关 | |||||
#### 创建/打开项目 | |||||
1. 打开vs2022,选择创建`新项目`,选择`控制台`项目 | |||||
 | |||||
2. 给项目起一个名字 点击`创建` | |||||
 | |||||
3. 创建成功的界面 | |||||
 | |||||
#### 加载/卸载项目 | |||||
1. **加载项目**:在资源管理器上右键选择`添加`>`现有项目`选择创建的C++的项目 | |||||
 | |||||
资源管理器中已经有两个项目 | |||||
 | |||||
2. **卸载项目**:右键所需要卸载的项目点击卸载项目 | |||||
 | |||||
显示已经被卸载 | |||||
 | |||||
ps:如果想要隐藏想要卸载的项目可以在资源管理器上右键选择`隐藏所卸载的项目` | |||||
#### 设置启动项 | |||||
想要那个项目作为启动项可以在这个项目上面右键选择`设置为启动项` | |||||
 | |||||
### 解决方案相关 | |||||
#### 添加项目 | |||||
在解决方案上右键选择`添加`>`添加新建项`就会跳到创建项目界面,参考上面的[创建/打开项目](#创建/打开项目) | |||||
 | |||||
### 文件相关 | |||||
#### 创建/打开文件 | |||||
 | |||||
#### 包括/排除文件 | |||||
 | |||||
## 工程配置 | |||||
### 解决方案配置 | |||||
可以选中`Debug`和`Relase`版本 | |||||
点击`属性`>`配置管理器`选择配置 | |||||
 | |||||
### 平台配置 | |||||
点击`属性`>`平台`可以选择x64和win32 | |||||
 | |||||
### 项目类型配置 | |||||
在需要配置的项目右键点击`属性`>`配置类型`可以选择exe和dll和lib | |||||
 | |||||
### 路径配置 | |||||
* 输出路径配置 | |||||
点击`属性`>`常规`>`输出目录` | |||||
 | |||||
* 头文件路径配置 | |||||
 | |||||
* 源文件路径配置 | |||||
 | |||||
* 库文件路径配置 | |||||
 | |||||
### 宏定义 | |||||
右键项目属性点击`C/C++`>`预生成器`>`点击预处理器定义` | |||||
 | |||||
### 运行库配置 | |||||
1. **多线程调试 (/MTd)** | |||||
- 静态链接调试版运行库,生成的可执行文件独立运行,但体积较大。 | |||||
- 适用于调试环境,无需依赖外部 DLL。 | |||||
2. **多线程 (/MT)** | |||||
- 静态链接发布版运行库,生成的文件同样独立运行,但不含调试信息。 | |||||
- 适用于发布版本,减小依赖。 | |||||
3. **多线程调试 DLL (/MDd)** | |||||
- 动态链接调试版运行库,依赖系统或项目目录中的调试 DLL(如 `msvcrtd.dll`)。 | |||||
- 适用于调试环境,减小可执行文件体积。 | |||||
4. **多线程 DLL (/MD)** | |||||
- 动态链接发布版运行库,依赖系统或项目目录中的发布 DLL(如 `msvcr120.dll`)。 | |||||
- 适用于发布版本,多个程序可共享同一 DLL。 | |||||
 | |||||
### 调用库配置 | |||||
1. 配置静态库的头文件选择`属性`>`C/C++`>`附加包含目录`将头文件目录配置上去 | |||||
 | |||||
2. 配置静态库的所在位置,选择`属性`>`链接器`>`常规`>`附加库目录`配置其所在路径 | |||||
 | |||||
3. 配置静态库的所在位置,选择`属性`>`链接器`>`输入`>`附加依赖项`配置其名字 | |||||
 | |||||
### 安全检查 | |||||
右键点击项目 > `属性` >`C/C++` >`代码生成`>`安全检查`选择是否启用 | |||||
 | |||||
## 工程调试 | |||||
### 断点 | |||||
#### 断点创建 | |||||
在最左侧侧边栏,出现红点就说明断点添加成功 | |||||
 | |||||
#### 断点删除 | |||||
再次点击断点,即可删除 | |||||
#### 断点禁用,启用 | |||||
右键断点,即可选择是否启动,禁用断点 | |||||
 | |||||
#### 条件断点 | |||||
右键断点选择条件断点,设置条件为`i == 5`,表示当i=5时才会命中断点 | |||||
 | |||||
运行程序就会发现当输出5边时候会命中断点 | |||||
 | |||||
## 窗口 | |||||
### 监视窗口 | |||||
点击上方`调试`>`窗口`>`监视` 可以选择监视窗口,也可以选择下方的自动窗口 | |||||
 | |||||
### 内存窗口 | |||||
点击上方`调试`>`窗口`>`内存` 可以选择 | |||||
 | |||||
### 线程窗口 | |||||
点击上方`调试`>`窗口`>`线程` 可以选择 | |||||
 | |||||
### 调用堆栈窗口 | |||||
点击上方`调试`>`窗口`>`调用堆栈` 可以选择 | |||||
 | |||||
## 单步调试 | |||||
### 全速运行 | |||||
全速运行就是不命中断点,点击上方`调试`>`开始执行(不调试)`> | |||||
 | |||||
### 重新运行 | |||||
快捷站是`ctrl+shfit+F5` | |||||
 | |||||
### 逐过程 | |||||
快捷站是`F10` | |||||
 | |||||
### 逐语句 | |||||
快捷站是`F11` | |||||
 |