Visual Studio使用技巧与经验合集
独立文章
- 待补充
实用插件
- Rainbows Braces 不同的括号使用不同颜色配对表示
- Indent Guides 不同缩进使用线和不同颜色表示
- VSColorOutput 使用不同颜色显示不同输出信息
- Format on Save 保存文件时自动格式化
- Tabnine AI 人工智能加持代码提示
- Qt Visual Studio Tools VS中使用Qt
dumpbin
打开VS自带的命令行工具,查看导出函数
1 | |
激活密钥
| 版本 | 类型 | 密钥 |
|---|---|---|
| 2010 | Express | 6VPJ7-H3CXH-HBTPT-X4T74-3YVY7 |
| 2010 | Ultimate | YCFHQ-9DWCY-DKV88-T2TMH-G7BHP |
| 2012 | Ultimate | YKCW6-BPFPF-BT8C9-7DCTH-QXGWC |
| 2013 | Ultimate | BWG7X-J98B3-W34RT-33B3R-JVYW9 |
安装包
官网一般会提供最新版的社区版的安装包。旧版本的社区版安装包不提供下载。专业版、企业版随时都可以下载。从官网或者官网2可以下载到所有版本,如果没看见就用搜索
社区版需要登录微软账号才能使用。专业版和企业版可以从微软官网下载最新版。
社区版安装包:
跨版本编译
当使用新版本VS打开旧版本的工程编译时,可能会遇到符号问题
1 | |
无法解析的外部符号 __imp___vsnprintf
在 vs2015 工程选项,链接器附加依赖项里面添加 legacy_stdio_definitions.lib 即可。
出现这个问题的原因是 新版本vs 默认编译时将许多标准库采用内联方式处理,因而没有可以链接的标准库文件,所以要专门添加标准库文件来链接标准库中的函数。
无法解析的外部符号 __iob_func
其实 __iob_func 和 __iob 都是用来定义 stdin,stdout,stderr,只是不同的VC版本实现方式不同。
下面是VS2015的头文件corecrt_wstdio.h中对stdin,stdout,stderr定义
1 | |
原来在 VS2015 中 __iob_func 改成了 __acrt_iob_func
在自己的代码中增加了一个名为 __iob_func 转换函数:
1 | |
再次编译,错误消失。
LNK2038 RuntimeLibrary不匹配
程序编译的时候报错
- 错误 LNK2038:检测到“RuntimeLibrary”的不匹配项:值“MD_DynamicRelease”不匹配值“MT_StaticRelease”
- 错误 LNK2038:检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(
*.obj中)
原因
- 0不匹配2,Debug模式下使用了Release库文件
- 2不匹配0,Release模式下使用了Debug库文件
- 其他字符串一眼就能看出来问题
值
| 参数 | 类型 |
|---|---|
| 多线程调试Dll (/MDd) | MD_DynamicDebug |
| 多线程Dll (/MD) | MD_DynamicRelease |
| 多线程(/MT) | MD_StaticRelease |
| 多线程(/MTd) | MD_StaticDebug |
解决
VS
如果是数字,在VS工程项目->属性->属性配置->C/C+±>预处理器->预处理定义->添加"_ITERATOR_DEBUG_LEVEL=2"(根据需要添加)
提示是MD_*之类的在工程上右键->属性->c/c++->代码生成->运行库 中修改为报错右侧的值,比如说 MD_StaticDebug
Qt
1 | |
设置完必须清理->qmake->重新构建
命令行参数
在COMMON_COPTIONS选项后面继续添加/Zi /DEBUG /D"_DEBUG" /D"_ITERATOR_DEBUG_LEVEL=2"
- /DEBUG只是是否要生成调试信息的开关。这个命令行选项在链接器页面那里
- /Zi只是生成的调试信息的格式,这个格式是.pdb文件。当然还有好几种格式。这个命令行在编译页那里
- /D"_DEBUG"使用DEBUG模式

