Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

Visual Studio知识集锦

17
May
2010

Visual Studio知识集锦

By Alex
/ in C,C++
/ tags VS
0 Comments
IDE配置FAQ
全局配置FAQ
  1. 如何导入/导出样式主题?Theme ⇨ Customize Colors,左上角第2/3个按钮,分别执行导入/导出
  2. 如何导入/导出VS的设置?Tools ⇨ Import and Export Settings
  3. 如何清空查找(Find)历史:定位到注册表HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Find,删除所有Find*、Replace*键值,然后重启VS
工程配置FAQ
  1. 在调试(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风格的快捷键

对于习惯了Eclipse开发的程序员来说,改用Visual Studio快捷键相当痛苦,经常按错。我的解决办法是,配置Options  - Environment - Keyboard结合AutoHotKey脚本:

我修改的Visual Studio 快捷键包括:

  1. Edit.FormatDocumentAStyle = Ctrl+Shfit+F @TextEditor
  2. Edit.MoveLineUp = Alt+UpArrow @TextEditor
  3. Edit.MoveLineDown = Alt+DownArrow @TextEditor
  4. VAssistX.NavigateBack  = Alt+LeftArrow
  5. VAssistX.NavigateForward = Alt+RightArrow

我使用的AutoHotKey脚本如下:

DevKeyMapping.ahk
INI
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

VisualStudioCommon.ahk
INI
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 ^{,}
C/C++开发环境配置FAQ
如何工程的默认属性

VC++工程可以的属性可以继承来的(inherited properties)。右键打开工程属性,粗体的部分是在当前工程的.vcxproj文件中定义的,而非粗体的则从其它文件继承得到,这些文件被称为 Property Sheets,属性集中配置的工程属性会自动导入到目标工程中。

在View ⇨ Other Windows ⇨ Property Manager中,可以看到工程用到的Property Sheets。注意图标property-sheet-readolny表示该Sheet是构建系统自带、只读的。property-sheet则意味着该Sheet可以修改,你可以在其中设置属性,供VC++工程继承。 

如何编译64位(x86_64)应用程序

定位到 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后缀
常见问题
启动后,打开编辑器报错:An exception has been encountered, this may be caused by an extension

保存信息:Microsoft.VisualStudio.Text.Editor.Implementation.WpfTextView...

解决办法:禁用扩展VAssistX,重启后,再次启用解决。

构建DLL时,不生成对应的lib导入库

如果代码中没有任何函数/数据被导出,则不会生成lib

LINK1123: failure during conversion to COFF: file invalid or corrupt

该问题可能和增量链接功能有关,可以关闭:Linker - General - Enable Incremental Linking 设置为NO

另外,可以查找VS安装目录下的文件:VC\bin\cvtres.exe、VC\bin\amd64\cvtres.exe,如果报错无法运行,说明这两个文件损坏,可以到你安装.NET framework 4.x的目录中拷贝过来,即可解决此问题

常用命令
CL命令

要想通过命令行进行编译、链接,需要把 %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选项
LINK命令

与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),有三种方式指定导出:

  1. 在源代码中声明 __declspec(dllexport) 
  2. 在模块定义文件.def中声明EXPORTS 
  3. 提供连接选项/EXPORT

在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文件,该文件包含关于被链接程序的下列信息:

  1. 模块名,即文件的base name
  2. 来自程序文件头的时间戳
  3. 程序中groups的列表,包括组起始地址、长度、组名称、类
  4. 程序中公共符号的列表,包括符号名称、flat地址、定义符号的.obj文件
  5. 入口点
/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 Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • Cygwin知识集锦
  • GNU Make学习笔记
  • CLion知识集锦
  • MinGW知识集锦
  • 基于MinGW的海康视频监控开发

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2