Visual Studio知识集锦
- 如何导入/导出样式主题?Theme ⇨ Customize Colors,左上角第2/3个按钮,分别执行导入/导出
- 如何导入/导出VS的设置?Tools ⇨ Import and Export Settings
- 如何清空查找(Find)历史:定位到注册表HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Find,删除所有Find*、Replace*键值,然后重启VS
- 在调试(Debug)时,如何指定命令行参数?Project ⇨ Properties ⇨ Configuration Properties⇨ Debugging,在Command Arguments中输入参数
插件 | 说明 |
Visual Studio Color Theme Editor | IDE主题支持,安装后,出现菜单Theme |
VSColorOutput | 安装后在Build/Debug的输出窗口中,显示彩色文字 |
Visual Assist | 增强C/C++/C#的导航、重构、代码生成、代码助手功能 |
Triple Click | 类似Eclipse的三击选中正行 |
Move Line Command | 类似Eclipse的Alt +Up/Down来移动当前行 |
Indent Guides | 在每个缩进级别显示灰色的垂直虚线 |
AStyle Extension | 代码格式化工具 |
Go to Definition | 类似于Eclipse的,Ctrl+Left跳转到变量、类型的定义处 |
对于习惯了Eclipse开发的程序员来说,改用Visual Studio快捷键相当痛苦,经常按错。我的解决办法是,配置Options - Environment - Keyboard结合AutoHotKey脚本:
我修改的Visual Studio 快捷键包括:
- Edit.FormatDocumentAStyle = Ctrl+Shfit+F @TextEditor
- Edit.MoveLineUp = Alt+UpArrow @TextEditor
- Edit.MoveLineDown = Alt+DownArrow @TextEditor
- VAssistX.NavigateBack = Alt+LeftArrow
- VAssistX.NavigateForward = Alt+RightArrow
我使用的AutoHotKey脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
SetTitleMatchMode 2 ;;;;;;; Keymapping for Visual Studio 2008/2010 ;;;;;;; #IfWinActive , Microsoft Visual Studio #Include VisualStudioCommon.ahk #IfWinActive ;;;;;;; Keymapping for Visual Studio 2008/2010 Debugging ;;;;;;; #IfWinActive (Debugging) - Microsoft Visual Studio F5::F11 F6::F10 F7::+F11 F8::F5 #Include VisualStudioCommon.ahk #IfWinActive ;;;;;;; Keymapping for Chrome Developer Tools ;;;;;;; #IfWinActive Developer Tools F5::F11 F6::F10 F7::+F11 ^F5::F5 ^l::^g #IfWinActive |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
;Eclipse Code Assist - Edit.ListMembers !/::SendInput ^{j} ;Eclipse Delete line - Edit.LineDelete ^D::SendInput ^+{l} ;Eclipse Goto Line - Edit.GoTo ^L::SendInput ^{g} ;Eclipse Goto Definition - Edit.BriefBrowse F3::SendInput !{g} ^LButton:: SendInput {LButton} SendInput {LButton} SendInput !{g} return ;Eclipse Comment line - Edit.CommentSection ^/:: SendInput ^{k} SendInput ^{c} return ;Eclipse Uncomment line - Edit.UncmmentSection ^+/:: SendInput ^{k} SendInput ^{u} return ;Eclipse Close Editor - Window.CloseDocumentWindow ^W::SendInput ^{F4} ;Eclipse Open Type - Edit.NavigateTo ^+T:: SendInput ^{,} |
VC++工程可以的属性可以继承来的(inherited properties)。右键打开工程属性,粗体的部分是在当前工程的.vcxproj文件中定义的,而非粗体的则从其它文件继承得到,这些文件被称为 Property Sheets,属性集中配置的工程属性会自动导入到目标工程中。
在View ⇨ Other Windows ⇨ Property Manager中,可以看到工程用到的Property Sheets。注意图标表示该Sheet是构建系统自带、只读的。则意味着该Sheet可以修改,你可以在其中设置属性,供VC++工程继承。
定位到 Build - Configuration Manager ,在弹出的对话框中, Platform 列下拉菜单选择 x64 ,如果没有x64,则点击 <New...> 新建。完成这一修改后,VS会调用合适的编译器进行构建。
工程根目录上点击右键 Properties - Configuration Properties,参下表分别设置:
项目 | 步骤 |
头文件包含目录 | 展开 C/C++ - General - Additional Include Directories ,添加需要的目录 |
库文件目录 | 展开 Linker - General - Additional Library Directories ,添加需要的目录 |
依赖库 | 展开 Linker - General - Input - Additional Dependencies,添加依赖库,注意lib后缀 |
保存信息:Microsoft.VisualStudio.Text.Editor.Implementation.WpfTextView...
解决办法:禁用扩展VAssistX,重启后,再次启用解决。
如果代码中没有任何函数/数据被导出,则不会生成lib
该问题可能和增量链接功能有关,可以关闭:Linker - General - Enable Incremental Linking 设置为NO
另外,可以查找VS安装目录下的文件:VC\bin\cvtres.exe、VC\bin\amd64\cvtres.exe,如果报错无法运行,说明这两个文件损坏,可以到你安装.NET framework 4.x的目录中拷贝过来,即可解决此问题
要想通过命令行进行编译、链接,需要把 %VS_HOME%\Common7\IDE 附加到PATH环境变量中。
CL命令位于 %VS_HOME%VC\bin 目录及其子目录中,区别如下:
CL文件 | 说明 |
cl.exe | 编译32位的应用程序 |
amd64\cl.exe | 编译64位的应用程序 |
x86_amd64\cl.exe | 如果当前系统为x86架构,用于交叉编译出x86_64的应用程序 |
CL命令的常用选项如下:
选项 | 说明 |
优化选项 | |
/O1 | 最小空间占用 |
/O2 | 最大运行速度 |
/Ob{0|1|2} | 控制内联函数的展开:0禁止展开;1标记为 inline, __inline, __forceinline的函数展开;2除了1以外,编译器可以自动展开其选择的函数 |
/Od | 禁止优化 |
/Og | 启用全局优化 |
/Ox | 最大优化 |
代码生成 | |
/GF | 启用只读字符串池 |
/GR[-] | 启用C++ RTTI |
/EHa |
异常处理模型(exception-handling model)同时捕获异步(Structured Exceptions,SEH)和同步(C++)异常 SEH是Unix信号的Win32等价物,即OS级别的异常;相对的C++异常是User级别的异常 |
/EHs | 异常处理模型仅捕获C++异常,并且告知编译器假设 extern "C" 函数可能抛出异常 |
/EHsc | 异常处理模型仅捕获C++异常,并且告知编译器假设 extern "C" 函数不会抛出异常 |
/RTC1 | 等价于/RTCsu |
/RTCc | 当变量被赋值给较小的数据类型并导致数据丢失时报告 |
/RTCs | 启用栈帧运行时检查 |
/RTCu | 当变量在未初始化的情况下被使用时,报告 |
/Gd | __cdecl调用约定 |
/Gr | __fastcall调用约定 |
/Gz | __stdcall调用约定 |
/GZ | 启用栈检查 |
/arch:<SSE|SSE2|AVX> | 指定最小的CPU架构需求 |
输出文件 | |
/Fa[file] | 汇编列表文件 |
FA[scu] | 配置汇编列表 |
/Fd[file] | .PDB文件。自动传递 /PDB:file给LINK |
/Fe<file> | 可执行文件。自动传递 /OUT:file给LINK |
/Fm[file] | Map文件。自动传递 /MAP:file给LINK |
/Fo<file> | .obj文件 |
FR[file] | 扩展的.sbr文件 |
/Fi[file] | 预处理后的文件 |
预处理 | |
/AI<dir> | 添加目录到汇编搜索路径 |
/E | 仅预处理,不编译或链接,输出到stdout,/P类似,输出到文件 |
/C | 不删除注释 |
/D<name>{=|#}<text> | 定义宏 |
/U<name> | 移除预定义宏 |
/u | 移除所有预定义宏 |
/I<dir> | 添加目录到头文件搜索路径 |
语言 | |
/Zi | 启用Debug信息,生成一个程序数据库(PDB),其中包含供调试器使用的类型信息和符号化调试信息。自动传递/DEBUG给LINK |
/Z7 | 启用旧式Debug信息,生成包含了用于调试器的完整符号信息(变量类型、名称、函数、行号)的.obj文件,不生成任何.pdb文件。自动传递/DEBUG给LINK |
/Zp[n] | 使结构体n字节对齐 |
/Za | 禁止语言扩展。如果代码与ANSI C或ANSI C++不兼容将报错 |
/Ze | 启用语言扩展(默认) |
/Zl | 在.obj中省略默认库的名称 |
/ZI | 采用支持“编辑并继续”功能的格式生成PDB |
链接 | |
/LD | 创建DLL。自动传递/DLL给LINK |
/LDd | 创建DLL Debug库。自动传递/DLL给LINK |
/F<num> | 设置栈大小自动传递/STACK:num给LINK |
/link | 给连接器传递额外选项。CL会自动调用LINK,除非指定/c |
/MD | 与动态CRT库MSVCRT.LIB链接。本选项和紧接着的3个选项,会在.obj中设置默认库的名称,供LINK读取 |
/MDd | 与动态CRT库MSVCRT.LIB的Debug库链接。自动定义符号_DEBUG |
/MT | 与静态CRT库LIBCMT.LIB链接 |
/MTd | 与静态CRT库LIBCMT.LIB的Debug库链接。自动定义符号_DEBUG |
杂项 | |
@<file> | 从文件中读取选项 |
/c | 只编译不链接 |
/J | 默认使用无符号的char类型 |
/MP[n] | 最多使用n个线程并行编译 |
/TC | 把所有文件作为C编译 |
/TP | 把所有文件作为C++编译 |
/V<string> | 设置版本字符串 |
/w | 禁止所有警告 |
/Wall | 启用所有警告 |
/Yd | 在每个.obj文件中存放Debug信息 |
/Y- | 禁止所有PCH选项 |
与CL类似,LINK也有32/64/交叉编译版本。LINK常用选项如下:
选项 | 说明 |
@filename | 从文件读取链接选项 |
/ALIGN | 程序的线性地址空间中每个段(Section)对齐的字节数,必须是2^n次方,默认4KB。除非编写类似驱动之类的软件,不需要设置 |
/BASE |
/BASE:{address[,size] | @filename,key} 为程序设置一个基地址(Base address),覆盖默认基地址设置(.exe为0x400000;.DLL为0x10000000)。如果address不是64K的倍数,链接器报错 |
/DEBUG | 为DLL或者exe创建调试信息,调试信息存放在.pdb文件中 |
/DEF:filename | 给链接器传递一个模块定义文件(Module-Definition File,.def),此文件为连接器提供被链接程序的导出、属性、和其它信息 |
/DEFAULTLIB:library | 添加一个库到库列表,链接器解析引用时将顺序搜索该列表。该库将存放在命令行指定的库的后面,在.obj中指定的默认库的前面 |
/DLL |
构建一个DLL作为主要输出文件。DLL通常包含供其它程序使用的导出(exports),有三种方式指定导出:
在VS界面中,可以设置项目属性:Configuration Properties - General - Configuration Type,指定构建DLL |
/DRIVER | 创建Windows NT内核模式的驱动 |
/ENTRY:function |
指定用户定义的入口点函数,入口点函数指定的DLL/exe的起始地址。该函数必须遵守__stdcall调用阅读,参数/返回值依赖于程序类型(控制台/窗口/DLL)。 最好由链接器自动指定入口点,以便正确的初始化C运行时库 |
/EXPORT |
/EXPORT:entryname[,@ordinal[,NONAME]][,DATA] 导出函数或者数据,供其它程序使用。entryname指定函数/数据的名称,该名称被调用者使用;ordinal指定函数/数据在导出表(exports tables)中的序号,1-65535之间,默认1;NONAME指示不使用入口点名称,只使用序号;DATA指示导出的是数据而不是函数 |
/FIXED[:NO] | 强制OS从程序期望的基地址加载,如果失败,则不会加载 |
/HEAP:reserve[,commit] | 设置堆的大小,仅对exe有意义 |
/IMPLIB:filename | 覆盖链接器创建的导入库 (.lib)中的默认名称 |
/INCLUDE:symbol | 指定需要加入到符号表中的符号。如果要添加多个符号,可以指定该选项多次 |
/INCREMENTAL | 以增量方式链接 |
/LARGEADDRESSAWARE | 提示链接器,程序能够处理大于2GB的地址 |
/LIBPATH | 指定搜索库的路径,这些路径优先在LIB环境变量前搜索 |
/MACHINE |
/MACHINE:{ARM|EBC|IA64|MIPS|MIPS16|MIPSFPU|MIPSFPU16| SH4|THUMB|X64|X86} 指定构建的程序在何种架构下运行 |
/MAP[:filename] |
提示链接器创建一个MAP文件,该文件包含关于被链接程序的下列信息:
|
/MAPINFO:EXPORTS | 提示MAP中包含导出的函数信息 |
/NODEFAULTLIB[:library] | 列出解析外部引用时需要忽略的库 |
/NOENTRY | 创建一个仅包含资源的DLL |
/OPT | 控制链接器的优化动作 |
/OUT:filename | 指定链接输出文件的名称 |
/PDB:filename | 指定PDB文件的名称 |
/PDBALTPATH | 指定PDB文件的存放路径 |
/STACK:reserve[,commit] | 指定栈的大小 |
/SUBSYSTEM |
/SUBSYSTEM:{CONSOLE|WINDOWS) 指定可执行程序的运行环境 |
/VERBOSE | 打印链接进度的详细信息 |
/VERSION:major[.minor] | 在PE文件头添加版本号信息 |
/WX | 把链接警告作为错误看待 |
Leave a Reply