Visual Studio使用技巧与经验合集

独立文章

  • 待补充

实用插件

  • Rainbows Braces 不同的括号使用不同颜色配对表示
  • Indent Guides 不同缩进使用线和不同颜色表示
  • VSColorOutput 使用不同颜色显示不同输出信息
  • Format on Save 保存文件时自动格式化
  • Tabnine AI 人工智能加持代码提示
  • Qt Visual Studio Tools VS中使用Qt

dumpbin

打开VS自带的命令行工具,查看导出函数

1
2
dumpbin /exports x.dll
dumpbin /linkermember x.lib

激活密钥

版本类型密钥
2010Express6VPJ7-H3CXH-HBTPT-X4T74-3YVY7
2010UltimateYCFHQ-9DWCY-DKV88-T2TMH-G7BHP
2012UltimateYKCW6-BPFPF-BT8C9-7DCTH-QXGWC
2013UltimateBWG7X-J98B3-W34RT-33B3R-JVYW9

安装包

官网一般会提供最新版的社区版的安装包。旧版本的社区版安装包不提供下载。专业版、企业版随时都可以下载。从官网或者官网2可以下载到所有版本,如果没看见就用搜索

社区版需要登录微软账号才能使用。专业版和企业版可以从微软官网下载最新版。

社区版安装包:

跨版本编译

当使用新版本VS打开旧版本的工程编译时,可能会遇到符号问题

1
2
无法解析的外部符号 __imp___vsnprintf
无法解析的外部符号 __iob_func

无法解析的外部符号 __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
2
3
4
5
ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);

#define stdin (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))

原来在 VS2015 中 __iob_func 改成了 __acrt_iob_func

在自己的代码中增加了一个名为 __iob_func 转换函数:

1
2
3
4
5
6
7
8
9
10
#if _MSC_VER>=1900
#include "stdio.h"
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
#ifdef __cplusplus
extern "C"
#endif
FILE* __cdecl __iob_func(unsigned i) {
return __acrt_iob_func(i);
}
#endif /* _MSC_VER>=1900 */

再次编译,错误消失。

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
2
3
4
5
6
7
CONFIG(debug, debug|release) {
QMAKE_CXXFLAGS_DEBUG += /MTd
}

CONFIG(release, debug|release) {
QMAKE_CXXFLAGS_RELEASE += /MT
}

设置完必须清理->qmake->重新构建

命令行参数

在COMMON_COPTIONS选项后面继续添加/Zi /DEBUG /D"_DEBUG" /D"_ITERATOR_DEBUG_LEVEL=2"

  • /DEBUG只是是否要生成调试信息的开关。这个命令行选项在链接器页面那里
  • /Zi只是生成的调试信息的格式,这个格式是.pdb文件。当然还有好几种格式。这个命令行在编译页那里
  • /D"_DEBUG"使用DEBUG模式

Visual Studio使用技巧与经验合集
https://blog.jackeylea.com/windows/how-to-use-visual-studio/
作者
JackeyLea
发布于
2024年11月27日
许可协议