参考:vs目录
首先演示一个虚拟的解决方案和我们期望得到的目录结构,然后使用VC2008的项目设置功能来一步一步达到我们的需求。虚拟解决方案:该虚拟解决方案名为GMA,包含一个动态链接库项目ChocolateMilk和一个应用程序项目PureMilk,需要使用一个第三方库log4cxx(Apache log4j的C++移植版本,用于日志输出)。log4cxx是以动态库的方式编译的,所以我们需要它的3样东西,分别是头文件,导入库(log4cxx.lib, log4cxxd.lib)和动态链接库(log4cxx.dll)。
目录说明:
1. GMA是解决方案目录
2. PureMilk和ChocolateMilk是项目目录
3. Lib目录用于存放导入库或者静态库(包括第三方库和自己的项目)
4. Include用于存放第三方库的头文件
5. Bin目录存放所有动态链接库和执行档,包括自己的产出和第三方库,区分Release和Debug两个版本。另外,程序运行过程中需要外部的数据文件和启动时需要的配置文件等等都可放于该目录
6. Temp用于存放临时生成文件,其中Compile存放编译器编译时生成的obj文件,Link存放链接器的输出文件。
上面目录结构清晰,一面了然,当我们的程序需要制作安装包或者要打包源码
发布的时候,它能够使得我们生活变得更容易^_^。制作安装包时我们只需将“/GMA/Bin/Release/”目录下的所有文件打包。
发布和转移源码的时候我们可以打包除了Temp目录以外“/GMA/”下面的所有文件和目录(如果不需要执行档,也可不包括Bin)。我们的需求是明确的,可是VC 2008并不会自动为我们做好上面所有的事情。不过我们并不需要编写复杂的编译脚本(makefile),只需要简单的修改项目的缺省设置即可。
我们需要VC为我们做的事情包括:
1.使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录
2.使用“/GMA/Temp/Link/”作为项目链接的输出目录
3.当项目是应用程序时,在构建结束后拷贝执行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,当项目是动态链接库时,除了拷贝dll到Bin,还拷贝导入库到“/GMA/Lib/”
4.当项目是应用程序时,调试时运行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的执行文件,并以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”为工作目录
项目设置中可以使用的宏
名称 | 作用 |
---|---|
Configuration | 配置名字,通常是Debug或者Release |
IntDir | 编译器使用的中间目录,产出obj文件 |
OutDir | 链接器使用的输出目录 |
ProjectDir | 项目目录,即.dsp/.vcproj所在目录。 |
ProjectName | 项目名字 |
SolutionDir | 解决方案目录 |
TargetDir | 目标输出文件所在的目录 |
TargetExt | 目标输出的扩展名 |
OutDir | 链接器使用的输出目录 |
TargetFileName | 目标输出文件名,包括扩展名 |
TargetName | 目标输出名,不包括扩展名 |
TargetPath | 目标输出文件的全路径名 |
首先来设置ChocolateMilk:
1.使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录
2.使用“/GMA/Temp/Link/”作为项目链接的输出目录
注意高亮的部分,首先将配置改成All Configuration(全部配置),这样可以让我们同时修改Debug和Release的部分;
Output Directory(输出目录,链接器)栏位填入:$(SolutionDir)\Temp\Link$(ProjectName)\$(ConfigurationName)
Intermediate Directory(中间目录,编译器)栏位填入:
$(SolutionDir)\Temp\Compile$(ProjectName)\$(ConfigurationName)3.构建结束后拷贝动态链接库到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,拷贝导入库到“/GMA/Lib/”
我们通常都会在Debug版本的输出库后面加上字母“d”以表示这是Debug版本,在Debug配置下,修改Import Library栏位:
VC可以让我们设置构建前后执行的脚本程序,所以为了完成3,我们需要写构建后执行的脚本:
在Command Line中填入,Debug配置下:
copy $(TargetPath)$(SolutionDir)\Bin$(ConfigurationName)\;
copy $(TargetDir)$(TargetName)d.lib $(SolutionDir)\Lib\;
Release配置下:
copy $(TargetPath) $(SolutionDir)\Bin$(ConfigurationName)\;
copy $(TargetDir)$(TargetName).lib $(SolutionDir)\Lib\;
之所以要分别设置是因为VC没有表示导入库的宏名字 -_-P
OK,到此为止,你就可以编译ChocolateMilk项目试试是不是一切正常了,不过请确认拷贝的目标目录事先建立好。
接下来我们设置应用程序项目PureMilk:
1.使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录
2.使用“/GMA/Temp/Link/”作为项目链接的输出目录
首先将配置改成All Configuration(全部配置),这样可以让我们同时修改Debug和Release的部分;
Output Directory(输出目录,链接器)栏位填入:
$(SolutionDir)\Temp\Link$(ProjectName)\$(ConfigurationName)
Intermediate Directory(中间目录,编译器)栏位填入:
3.构建结束后拷贝执行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”
在Command Line中填入,All配置下:
copy $(TargetPath) $(SolutionDir)\Bin$(ConfigurationName);
4.调试时运行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的执行文件,并以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”为工作目录
Command栏位填入:$(SolutionDir)\Bin$(ConfigurationName)\$(TargetFileName)
Working Directory栏位填入:$(SolutionDir)\Bin$(ConfigurationName)\
这样就大功告成了,现在你就可以编译该执行程序并进行调试。
常用设置
1、输出exe路径
【配置属性】-【常规】-【输出目录】,设置为“../bin/”
2、中间文件路径
【配置属性】-【常规】-【中间目录】,设置为“../temp/”
3、调试工作目录
【配置属性】-【调试】-【工作目录】,设置为“../bin/”
1. 直接把所有 dll 拷贝到 Visual Studio 工程目录下,或是拷贝到生成可执行文件的文件夹(默认情况下是Debug 或 Release 目录)下:
这个方法也很简单,但是当你有若干个工程时,你每次更新 SDK 及其 dll 文件,你就要把所有的工程都更新,这个不符合文件唯一性的工程性准则。
2. 把Dll文件夹加入到系统环境变量中
此方法比较好,所有工程共享dll文件,直接执行exe时调用。在调试程序时,让 Visual Studio 帮你切换当前工作目录到 dll 相应的目录下:
在 “工程属性”==> “配置属性” ==> “调试” ==> “工作目录” 里填上 dll 所在目录,这样当在调试程序时,Visual Studio 会把当前工作目录切换到这个目录下,从而会自动读取本目录下的dll 文件。
这个方法的优点很明显,简单!副作用也很明显,在你切换了当前工作目录后,你可能会找不到程序的配置文件,在程序里写的诸如”./config.ini”全部都找不到了;另外,你要把所有的dll 都放到这个工作目录里,否则一样会提示说找不到 xxx.dll 的问题。
3. 最后一个方法,也是我认为最好的一个方法,调试时,在VisualStudio 工程属性里把一个目录临时添加到 PATH 环境变量里:
方法很简单,在”工程属性”==> “配置属性” ==> “调试” ==> “环境”里,添加类似如下所示的内容:
PATH=../../common/dll;
但是只适用于调试,直接执行exe时,要调用系统PATH环境变量。
VS中C++的包含目录、附加包含目录和库目录和附加库目录的区别
编译器先搜索C++下面的目录,再搜索VC++下面的目录。我们一般使用C/C++和Linker下面的设置,而一般不建议使用VC++下面的设置。
方法1: 通过设置工程配置来添加lib库.
A、添加工程的头文件目录:工程—属性—配置属性—c/c++—常规—附加包含目录:加上头文件存放目录。
B、添加文件引用的lib静态库路径:工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。
C 然后添加工程引用的lib文件名:工程—属性—配置属性—链接器—输入—附加依赖项:加上lib文件名。
这种方法比较繁琐,且不直观,而且还可能要争对debug版本和release版本作不同的配置,因为我们生成的两个版本的库可能放在不同的目录中的.
方法2: 使用编译语句:
#ifdef _DEBUG
#pragma comment(lib,”..\debug\LedCtrlBoard.lib”)
#else
#pragma comment(lib,”..\release\LedCtrlBoard.lib”)
#endif这种方法直观,方便,且可以按如上直接区分出Debug版本和Release版本的不同目录.当然,通过宏,还可以区分更多版本.但是在指定目录时,不小心容易出错.
方法3: 直接添加库文件到工程中.
就像你添加.h和.cpp文件一样,把lib文件添加到工程文件列表中去.VC中,切换到”解决方案视图”,—>选中要添加lib的工程–>点击右键–>”添加”–>”现有项”–>选择lib文件–>确定.
就是这么简单,搞定.
这个方法适用于在我的工程的debug版本和Release版本中都使用同一个lib库文件时.这样就省去了你1方法配置环境的繁琐,也省去了方法2种语句的可能性错误发生.
文件名称 | 作用 |
---|---|
.sln(Visual Studio.Solution) | 它通过为环境提供对项目、项目项和解决方案项在磁盘上位置的引用,可将它们组织到解决方案中。 包含了较为通用的信息,包括解决方案所包含项目的列表,解决方案内任何项的位置以及解决方案的生成配置。 比如是生成Debug模式,还是Release模式,是通用CPU还是专用的等。此文件存储在父项目目录中,他是一个或多个.vcproj(项目)的集合。 |
.suo(Solution User Opertion) | 解决方案用户选项记录所有将与解决方案建立关联的选项,以便在每次打开时,它都包含您所做的自定义设置。 比如VS布局,项目最后编译的而又没有关掉的文件(下次打开时用)。同时包括解决方案的启动项,哪些窗口是docked或者floating |
.ncb(non-compiled browse) | 是智能感知信息文件,输入.后提示的那些信息,还有函数信息等都在这里,如果有时发现智能感知不工作了,不能提示了,而又找不到其他原因,可以尝试把.ncb文件删除,VS会自动重建一个。 |
vcproj(vc project file) | 包含一个项目的相关信息,包括项目中include头文件、lib文件等的文件路径等 |
.pch(precompiled headers) | 作用如它的名字。它是临时性的,同时可以设置不生成这个文件。 |
.user | 用户相关信息。 |
.vcxproj.filters | 用于项目下文件的虚拟目录 |
.sdf (SQL Server Compact Edition Database File) | 工程的信息保存成了数据库文件 |
.opensdf | .sdf文件的中间文件,工程关闭后自动删除 |
文件名称 | 作用 |
文件名称 | 作用 |
文件名称 | 作用 |
使用SVN时,可以将.suo .ncb .user .pch .sdf .opensdf等文件删除再commit。
Debug、Release临时文件
完成上面两点后,以后写代码就不会有动辄上百兆的垃圾文件跟代码放在一起了。拷贝、发布代码的时候再也不用一点点删了。
删除临时文件脚本
remove_All.bat
@echo off
echo ----------------------------------------------------
echo 删除临时文件
echo ----------------------------------------------------
pause
echo ----------------------------------------------------
echo ---开始删除文件
echo ----------------------------------------------------
del /F /Q /S *.aps *.idb *.ncp *.obj *.pch *.sbr *.tmp *.pdb *.bsc *.ilk *.res *.ncb *.opt *.suo *.dep *.exp Thumbs.db *.sdf BuildLog.htm *.user *.bak *.sh *.m4 *.in *.ac *.am *.guess *.suo *.user
echo ----------------------------------------------------
echo ---开始删除文件夹
echo ----------------------------------------------------
rd /q /S ipch
echo 以下为删除文件夹,慎用
echo for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn"
echo Rem for /r . %%a in (.) do @if exist "%%a\.svn" @echo "%%a\.svn"
pause
VS工程可忽略文件
.suo .ncb .user .pch .sdf .opensdf .res .obj .pdb .tlog *.lastbuildstate
点击【Edit】进行设置,对“global-ignores”进行修改,将忽略文件类型添加进去。
[miscellany]
### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its ‘status’ output, and
### while importing or adding files and directories.
#global-ignores = ## ..rej .rej .~ ~ .# .DS_Store
1、输出exe路径
【配置属性】-【常规】-【输出目录】
2、设置include、lib
方法一:*..vcxproj文件
false
..\bin\
.\lib\19points\include;.\lib\opencv\build\include;.\lib\json-x64\include;.\lib\libcurl-7.53.1-x64\include;.\lib\FaceRecognizer\include;.\lib\VIPLEmotion\include;.\lib\VIPLActionUnit\include;.\lib\FaceCropper\include;.\lib\FaceDetector\include;.\lib\lib\PointDetector\include; (IncludePath).\lib\opencv\build\x64\vc12\lib;.\lib\19points\lib\x64; ( I n c l u d e P a t h ) . \lib \opencv \build \x 64 \vc 12 \lib ; . \lib \1 9 p o i n t s \lib \x 64 ; (LibraryPath)
方法二:
【配置属性】-【VC++目录】-【包含/库目录】
3、禁用告警
【配置属性】-【C++】-【高级】
属性窗口默认是靠右停靠,但是我的习惯是放左边。因此需要移动。需要掌握两点:
在解决方案资源管理器左上角按下鼠标左键不放,往左拖动。
这时,要特别留意拖动时自动出现的归位提示框。鼠标一定要拖到提示框内才放手。这时,系统会自动将解决方案资源管理器放到合适的位置。
点击【工具】->【选项】->【文本编辑器】->【C/C++】,选中行号复选框。
vsvim.vsix
使用字体:Fixedsys Excelsior 3.01
1、首先下载字体:http://www.fixedsysexcelsior.com/,也可以从本站下载
2、安装字体:控制面板 -> 字体(路径为C:\Windows\Fonts),复制下载的文件进去。
3、打开VS2010,选择菜单:Tools->Options->Environment->Fonts and Colors.,选择Fixedsys Excelsior 3.01字体,选择字体大小为12。
解决方案1
在cmd下执行:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE>devenv /ResetSettings
解决方案2
如果方案1不可行,执行该方法。但是执行后需要重新安装VA、VsVim、重新设置字体。在cmd下执行:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE>devenv /resetuserdata
在工程上右键,打开属性页,配置属性–>C/C++–>优化,将优化改为“已禁用/Od”
常用快捷键:(从最常用开始)
F9 // 设置断点
F5 // 调试程序
F10 // 单步
F11 // 进入某个函数
Shift + F11 // 从某个函数跳出
Ctrl+Shift+Up/down //高亮突出引用之间的跳转
Shift+ Alt + O // 打开文件名搜索对话框
Alt + G // 跳到定义处
Alt + M // 输入函数名的一部分,查看某个函数
Alt + <- // 退回到上一视图
Alt + -> // 前进到下一视图 (这个快捷键是自定义的)
Ctrl + } // 如当时光标在”{” 处,则跳到配对的 “}”。如当时光标在”}” 处,则跳到配对的 “{“。
Alt + 向上方向键 // 跳到上一个类或函数
Alt + 向下方向键 // 跳到下一个类或函数
Ctrl + / // 加注释(这个快捷键是自定义的)
Shift + F9 // 快速查看变量
Alt + 3 // 查看变量
Alt + 7 // 查看堆栈
Alt + 6 // 查看内存
Shift + F5 // 退出调试程序
Ctrl + F5 // 运行程序,注意不是调试
F7 // 编译(如果编译后,出现了很多警告和个别错误,可以再按一下,F7再编译一次,这个时候,就会只出现错误,方便定位错误。)
Ctrl + I // 输入,增量搜索(实时查找)
Ctrl + F3 // 选中一个单词时,跳到下个单词(F3下一个,shift + F3 上一个)
Ctrl + Shift + F // 在文件中查找关键字,当前工程,当前文档,打开的文档,自定义等
Ctrl + F2 // 某行加书签 再按一次测去掉书签
F2 // 跳到一个书签,再按一下测跳到下一个书签
Shift + F2 // 跳到上一个书签
Ctrl + -> // 跳到一个单词最后
Ctrl + <- // 跳到一个单词最前
Ctrl + Shift + -> // 选择光标后的一个单词
Ctrl + Shift + <- // 选择光标前的一个单词
Shift + -> // 选择后的一个字母,每按一次增先一个字母
Shift + <- // 选择前的一个字母,每按一次增先一个字母
Ctrl + Shift + 空格 // 当光标在函数参数时,则提示函数参数列表
Ctrl + B // 加条件断点
Ctrl + L // 删除一行
Ctrl + Home // 跳到文档最前面
Ctrl + End // 跳到文档最后面
Home // 跳到一行最前面
End // 跳到一行最后面
点击【VASSISTX】->【Tools】选择【VA Outline】/ 【VA View】
菜单栏“VASSISTX”-“TOOLS”-“Edit VA Snippet”
这样设置好之后点击OK,下次想打段代码时只需要先敲#再敲2,出现“C++”代码块标题时,按回车,就可以自动打出相应代码块。而且光标自动定位到录入代码块中的 selected s e l e c t e d 处。如下图。
##3、消除中文注释警告
针对中文注释总会提示拼写错误问题(下面出现红色波浪线),将Visual Assist X Options —> Advanced —> Underlines中的Underline spelling errors in comments and strings 左边的勾去掉即可
先为VA设置一下我自己个人比较喜欢的快捷键,不多,就两个。
Tools->Options->Keyboard:Show commands containing:
VassistX.NavigateForward Alt + -> 前进到后面的页面 (注意:Shortcuts for selected command: 要选择TextEditor)
VassistX.SurroundSelectionWithComment Ctrl + / 加注释 (注意:Shortcuts for selected command: 要选择TextEditor)
作用 | 快捷键 |
---|---|
查找文件 | shift+alt+o |
查找符号 | shift+alt+s |
查找选定的内容 | shift+alt+f |
重命名 | shift+alt+r |
h/cpp文件切换 | alt+o |
函数声明定位 | alt+g |
PC-Lint安装配置与集成到VS2010
Pclint VC配置
pclint在VS2013中的配置