还剩4页未读,继续阅读
文本内容:
解决方案的目录结构设置和管理Vs以下内容为“原创”“转载”首先•解决方案和项目文件夹包含关系C++项目VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系,假设新建一个项目ssyy,解决方案起名fangan,注意解决方案包括项目•此时生成的最外层目录为fangan代表整个解决方案的内容都在这个文件夹内在这个fangan文件夹内包含有fangan.sln的解决方案配置文件和一个ssyy文件夹•ssyy文件夹代表整个ssyy项目的所有内容都在这个文件夹内,这个文件夹内含有ssyy.vcproj的项目配置文件和.h头文件以及.cpp源文件如果在fangan解决方案下再建立一个新项目名为ssyy2,则会在fangan文件夹下生成一个ssyy2文件夹存放ssyy2项目的所有内容由上面叙述可以总结出,管理器解决方案或项目都会对应一个总的文件夹这个管理器文件夹下存放本管理器的配置文件以及子管理器比如,解决方案是个管理器•它的文件夹下含有.sin配置文件以及子管理器ssyy项目和子管理器ssyy2项目另外默认情况下,项目属性设置的目录起点为项目配置文件所在位置,实际上就是项目头文件和源文件所在位置•补充vs中建立默认的C#项目和建立默认的C++项目生成的目录结构是不一样的如果是C#项目,则解决方案总文件夹下就只包含解决方案配置文件sin和一个项目总文件夹共两个东东,而项目总文件夹下包含c#源文件、项目配置文件proj、一个Properties属性文件夹、一个obj文件夹和一个bin文件夹,其中obj和bin文件夹下都包含debug和release两个文件夹obj文件夹下存放中间编译结果扩展名更加项目类型而不同,而bin文件夹下存放最终生成的结果扩展名一般为exe或dll而如果是C++项目,则解决方案总文件夹下就只包含解决方案配置文件sin和一个项目总文件夹和一个Debug文件夹以及一个Release文件夹共四个东东,其中Debug和Release文件夹中存放最终生成的结果exe或dll,要注意如果不使用Release生成则不存在Release文件夹,而项目总文件夹下包含C++源文件头文件、项目配置文件和一个Debug文件夹以及一个Release文件夹一定要注意,此处的Debug和Release文件夹仅仅存放中间编译结果obj,不存放exe和dll之类的东西如果不使用Release编译,则没有对应的Release文件夹由此可见,c#项目默认生成的文件目录结构更合理,且输出的exe位于总项目文件夹内,而C++项目默认exe位于解决方案总文件夹下另外c#更合理在•C#使用Bin目录,在Bin目录下包含debug和release两个目录•而C++不使用Bin目录•直接使用debug和releae两个目录其次常用项目属性和系统配置变量关系•如果我们建立一个默认的vc项目ssyy,他的默认“常规”栏目中,“输出目录”为$SolutionDir$ConfigurationName,所以调试时会在解决方案文件夹下建立一个debug ConfigurationName的值为debug文件夹,并在此文件夹下生成ssyy.lik链接器和ssyy.exe文件默认“中间目录”为$ConfigurationName,所以会在ssyy项目文件夹下即ssyy.vcproj的项目配置文件所在位置建立一个debug文件夹,并在该文件夹下生成ssyy.obj二进制文件默认“链接器”栏目下的“常规”选项下的“输出文件”选项为$OutDir\$ProjectName.exe•其中$OutDir就已经在“常规”栏目的“输出目录”选项赋值了【所以$OutDir的值是在“输出目录”属性中定义的】另外,经过实际测试,发现“输出目录”属性只能起到对$OutDir系统变量赋值的作用,和“改变生成的.exe文件存放位置”没任何关系也就是说•如栗输出目录”中设置的$OutDir值在C盘•而“输出文件”中设置输出文件的位置为D盘•最终生成的exe文件会在D盘,“输出文件”属性才决定输出exe文件的位置而$丁20戌口〃的值是在生成exe文件后自动赋予值为exe文件所在位置所以可以说,“输出文件”最终决定exe文件所在的位置,也最终决定了$TargetDir的值•$TargetPath^|]$TargetDir的行为是类似的•此不赘述上面两段说了这么多,总结就是,默认情况下“输出目录”和“输出文件”两个属性对应的目录是一样的,这样用着方便当然,输出文件的值在输出目录的值的基础上还包含有exe文件名如果两个不一样.则中间生成的链接器用的如xx.ilk和xx.pdb文件等在输出目录•而最终生成的xx.exe文件在“输出文件”属性设置的目录中另外,上面两段话可以总结出•当调试程序时•系统变量$OutDir的值是最先确定的,而$丁@0戌口和$丁@0所「讪的值是在exe文件生成后才确定的也就是说系统变量$OutDir的值由VS项目的“输出目录”属性决定,而$TargetDir和$TargetPath的值由VS项目的“输出文件”属性决定即设置了VS的“输出目录”属性就相当于设置了$OutDir的值,“输出目录”是界面上的提示用于接收用户输入的配置信息,然后把这个具体的配置信息存入系统内容的变量$OutDir中其它常用的属性还有,“调试”栏目中的“工作目录”项,这个属性默认情况下是空的,但表示工作目录是工程目录•也就是工程配置文件ssyy.vcproj所在目录工作目录表示进行某项操作的目的目录,会随着OpenFileDialog、SaveFileDialog等对象所确定的目录而改变“工作目录”属性作用是程序运行后唯一识别的默认目录•即工作后只认识这个目录•工作目录这个名字描述的就很形象,可以将所依赖的lib和dll库文件所在目录设为工作目录,但一般是把lib放在解决方案下的Lib目录中,把dll放在解决方案下的Bin目录中,例如程序运行过程中生成一个txt文本文件,如果在创建文件过程中未指定绝对路径,呆指定创建文件的文件名,那么这个文本文件默认就会建立在工作目录中,当然读取一些配置文件也在工作目录中查找,但要说明一下,生成的exe文件跟工作目录没任何关系•也不会放在工作目录中总的来说•工作目录就是程序运行过程中默认读取的目录对于dll,如果是程序运行前就进入内存有点像静态链接那样,此时dll就可以放入exe所在的执行目录,如果dll是运行中动态加载的一般放在工作目录,比如插件就放在工作目录即工作目录就是运行期间唯一能识别的默认目录,工作目录在代码中用GetCurrentDirectory之类的函数获取,具体代码间最下面的附1工作目录与执行目录可以不同例如一个人住在北京,但他的工作地点不一定在北京,可能在天津•【对工作目录的补充VS中工作目录的设置是给调试用的,也即你后动调试后,启动一个新进程,自动把这个新进程的工作目录设置为VS项目属性中的工作目录•然后新进程言动对应的exe程序但是如果不使用VS的调试旨动exe,而是直接双击exe文件旨动一个新进程时•会自动把这个新进程的工作目录设置为exe文件所在的目录•这是和vs后动调试不同的地方所以如果发布的时候不把工作目录内的东西拷到exe所在的目录内,就会运行出错,因为此时工作目录不再是vs中设置的了,而是exe文件所在的目录最后,说一下,vs中默认的vc++工程的工作目录项目的值是空的,代表默认是VS工程所在目录即.vcproj文件所在目录,c#工程默认没测试,估计和VC的一样】【同样在调试选项下的和工作目录选项同一级的选项“命令选项是设置,使用调试时,从哪里启动exe文件,因为一般生成的exe放在bin目录下的debug或release目录下•所以命令选项一般为“Bin\$Configuration\$ProjectName.exe,默认也是这个值,当然可以更改,但此时意味着调试状态下启动的exe为“命令”选项中设置的exe文件,而不是默认的bin目录下的debug或release下的exe文件了最后说一下,上面所说的“调试”是指vs下言动exe,包括debug模式和release模式不要把调试就理解为只有debug模式】“调试”栏目中的“命令Command”属性项,【这个属性表示调试器要启动的exe文件的全名】,包括路径名,默认为$TargetPath,而TargetPath就表示目标输出文件的全路径名,所以一般情况下它代表的值就等于“输出文件”属性代表的值当然你也可以人为的更改命令”属性的值,比如更改为c:\aa.exe,而“输出文件”的值为c:\bb.exe,此时如果输出文件所在目录没有aa.exe的话因链接器只生成bb.exe而根本不会生成aa.exe-调试器就不能后动aa.exe,提示找不到aa.exe当然如果目录中已经有aa.exe文件可以强制赋值一个bb.exe文件的副本并命名为aa.exe,此时调试器就可以正常调试通过“链接器”栏目下的“输入”选项下的“附加依赖项”项此项是设置程序链接时使用的静态库相当于链接已经编译好了的“代码”由此我们可以简单的认为这些库就相当于我们自己写的.cpp文件,只不过这些库是编译好了的.cpp而已这里只需要库名称即可,搜索路径在其他地方设置“附加依赖性的设置”等同于在代码中写“#pragma commentlib,”库名称.lib”语句•如果使用相对路径则如下#pragma commentlib,..\\debug\\TestLib.lib;其中的反斜杠要用双反斜杠,因为它是程序解释的双引号包括的字符串•需要转义一下,要区别nclude,include.ATestVideoApplication.h中并不是由程序解释的字符串,所以不用转义解决方案与项目从VC6之后VC系列就使用解决方案Solution来替代原来的工作空间,用于组织和管理多个相关的项目Project文章首先演示一个虚拟的解决方案和我们期望得到的目录结构,然后使用VC2008的项目设置功能来一步一步达到我们的需求虚拟解决方案该虚拟解决方案名为GMA•包含一个动态链接库项目ChocolateMHk和一个应用程序项目PureMHk,需要使用一个第三方库Iog4cxx ApacheIog4j的C++移植版本,用于日志输出【注意这个例子中ChocolateMHk项目只生成一个dll•PureMilk只生成一个exe】Iog4cxx是以动态库的方式编译的,所以我们需要它的3样东西,分别是头文件,导入库Iog4cxx」ib,Iog4cxxd」ib和动态链接库Iog4cxx.dll假设我们期望的目录结构如下图Q1,GM A是解决方案目录2•PureMilk和ChocolateMilk是项目目录3•Lib目录用于存放导入库或者静态库包括第三方库和自己的项目4-Include用于存放第三方库的头文件可以看出第三方库所有内容分布在Lib、Include和Bin中5•Bin目录存放所有动态链接库和执行档•包括自己的产出和第三方库•区分Release和Debug两个版本另外,程序运行过程中需要外部的数据文件和言动时需要的配置文件等等都可放于该目录6•Temp用于存放临时生成文件•其中Compile存放编译器编译时生成的bj文件,Link存放链接器的输出文件
7.PureMilk和ChocoHteMilk两个项目的头文件和源文件位置不要动,任然在各自的项目文件夹内上面目录结构清晰一面了然当我们的程序需要制作安装包或者要打包源码发布的时候,它能够使得我们生活变得更容易[八••制作安装包时我们只需将“/GMA/Bin/Release/”目录下的所有文件打包发布和转移源码的时候我们可以打包除了Temp目录以外“/GMA/”下面的所有文件和目录如果不需要执行档,也可不包括Bin我们的需求是明确的•可是VC2008VS2008并不会自动为我们做好上面所有的事情不过我们并不需要编写复杂的编译脚本makefile•只需要简单的修改项目的缺省设置即可我们需要VC VS为我们做的事情包括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/”为工作目录首先看一下项目设置中可以使用的宏,常用的有ConfigurationName配置名字•通常是Debug或者ReleaseIntDir编译器使用的中间目录,产出obj文件OutDir链接器使用的输出目录ProjectDir项目目录ProjectName项目名字SolutionDir解决方案目录TargetDir目标输出文件所在的目录TargetExt目标输出的扩展名TargetFileName目标输出文件名,包括扩展名TargetName目标输出名・不包括扩展名TargetPath目标输出文件的全路径名下图是某一个工程所有设置的例子□注意从上图可以看出•TargetDir指目标目录•是一个目录而TargetPath是目标路径,包括具体的文件名下面开始进行所举例子的工程设置首先来设置ChocolateMHk:1•使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录2•使用“/GMA/Temp/Link/”作为项目链接的输出目录注意高亮的部分,首先将配置改成All Configuration全部配置,这样可以让我们同时修改Debug和Release的部分;Output Directory输出目录,链接器栏位填入$SolutionDiij\Temp\Link\$ProjectName\$ConfigurationName IntermediateDirectory中间目录,编译器栏位填入$SolutionDir\Temp\Compile\$ProjectName\$ConfigurationName3•构建结束后拷贝动态链接库到“/GMA/Bin/Release/或“/GMA/Bin/Debug/,拷贝导入库到“/GMA/Lib/【这是因为若不设置,此时生成的dll和lib都在上面设置的输出目录中】我们通常都会在Debug版本的输出库后面加上字母“d”以表示这是Debug版本,在Debug配置下,修改Import Library栏位VC可以让我们设置构建前后执行的脚本程序,所以为了完成3,我们需要写构建后执行的脚本□在Command Line中填入,Debug配置下copy$TargetPath$SolutionDir\Bin\$ConfigurationName\;copy$TargetDir$TargetNamed.lib$SolutionDir\Lib\;Release配置下:copy$TargetPath$SolutionDir\Bin\$ConfigurationName\;copy$TargetDir$TargetName.lib$SolutionDir\Lib\;之所以要分别设置是因为VC没有表示导入库的宏名字-二P0K,到此为止,你就可以编译ChocolateMilk项目试试是不是一切正常了•不过请确认拷贝的目标目录事先建立好接下来我们设置应用程序项目PureMilk:1•使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录2•使用“/GMA/Temp/Link/”作为项目链接的输出目录首先将配置改成All Configuration全部配置•这样可以让我们同时修改Debug和Release的部分;Output Directory输出目录,链接器栏位填入$SolutionDir\Temp\Link\$ProjectName\$ConfigurationNameIntermediate Directory中间目录•编译器栏位填入:$SolutionDir\Temp\Compile\$ProjectName\$ConfigurationName3•构建结束后拷贝执行文件到“/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\$TargetFileNameWorking Directory栏位填入:$SolutionDir\Bin\$ConfigurationName\这样就大功告成了,现在你就可以编译该执行程序并进行调试以VS2010为列•一些项目属性截图如下-、调试-》命令如上图设置•如果项目名称为ss•则TargetName系统变量的值就是ss•TargetExt是扩展名为exe•此时单击调试按钮(vs中的那个小三角形按钮),会起动图中所示目录下的ss-XX-.exe文件注意调试栏目下的所有选项都是为了调试服务的•如果不用调试按钮,这些选项就不起作用至于VC++目录以及C/C++栏目是给编译器起作用的,无法是告诉编译器在哪里寻找头文件、库文件之类的事情或者设置其他一些编译器选项此不赘述••二二链接器・》常典》邈出文件(表示链接器生成的exe文件放在哪以及生成的exe文件名称)上图中,如果项目名称为ss,则连接器生成的exe为图中所示目录下的ss-YY-.exe文件一般来说这个文件的位置和名称要和上面所述的“命令”选项相同,以表示链接器生成的文件和调试时使用的文件一样(注意调试时如果没有修改源代码操作单击调试按钮后为了加快调试速度,并不会对程序••重新链接,也即不会后动链接器)经过我做过的一些实验证明•如果已经通过链接器生成了exe文件,手动修改这个exe文件名,调试时只要将上图所示的选项的文件名也进行相应的修改,一样可以进行调试并后动exe程序
三、链接器・》输入・》附加依赖项(此选项是设置程序链接时使用的静态库相当于链接已经编译好了的“代码”由此我们可以简单的认为这些库就相当于我们写的.cpp文件,只不过这些库是编译好了的.cpp而已)最后说一下,在开发过程中•究竟怎样来让Visual Studio链接这些lib及dll文件会比较好呢因为•在调试Visual Studio2008程序时,经常有一些动态链接库(即dll文件)需要加载到工程里,这样才能依赖第三方库进行程序调试这些动态链接库,往往都是测试版本或是开发中的版本•或者会有若干个版本;这个时候,如果直接把dll所在目录加到PATH里,则会有潜在冲突的危险;如果直接拷贝到Visual Studio的目录下,假如测试工程太多,每次有新版本的动态链接库更新时,你需要更新若干次拷贝、粘贴苦不堪言总体上来说•有几种方法可以改变Visual Studio的环境变量设置
1.直接添加到这个方法最简单,也最直接,但是坏处是会影响全局的PATH设置•尤其是你包含着大量测试用的dll时
2.在Visual Studio全局设置里,把dll所在目录添加到PATH里:通过Visual Studio菜单==工具==选项==项目和解决方案==VC++目录,在下拉框里选择”可执行文件”,然后把dll所在路径添加进去
3.直接把所有dll拷贝到Visual Studio工程目录下,或是拷贝到生成可执行文件的文件夹(默认情况下是Debug或Release目录)下这个方法也很简单,但是当你有若干个工程时,你每次更新SDK及其dll文件,你就要把所有的工程都更新,这个不符合文件唯一性的工程性准则
4.在调试程序时•让Visual Studio帮你切换当前工作目录到dll相应的目录下在Visual Studio==Project==Properties==Select Configuration==Configuration Properties==Debugging==Working directory里填上dll所在目录•这样当在调试程序时•Visual Studio会把当前工作目录切换到这个目录下•从而会自动读取本目录下的dll文件这个方法的优点很明显简单!副作用也很明显,在你切换了当前工作目录后,你可能会找不到程序的配置文件在程序里写的••诸如”./config.ini”全部都找不到了;另外,你要把所有的dll都放到这个工作目录里•否则一样会提示说找不到xxx.dll的问题
5.最后一个方法,也是我认为最好的一个方法,在Visual Studio工程属性里把一个目录临时添加到PATH环境变量里MSDN上也有类似的介绍,方法很简单•在“工程属性==调试”==“环境”里•添加类似如下所示的内容PATH=%PATH%;$TargetDir\DLLS这样就可以把$TargetDir\DLLS临时添加到该工程所属的系统PATH里大家可以根据项目的实际情况,灵活选用以上方法附1:C#获取设置工作目录和执行目录代码1获取和设置当前工作目录a System.IO.Directory.GetCurrentDirectory说明获取应用程序的当前工作目录的完全限定路径该方法是对Win32API的GetCurrentDirectory函数的一个封装例如:C:\Documents andSettings\Administrator\l\/ly DocumentsbSystem.Environment.CurrentDirectory说明获取或设置当前工作目录的完全限定路径该属性内部调用的就是方法,二者是效果是等价的例如:C:\Documents andSettings\Administrator\My DocumentsHcSystem.IO.Path.GetFullPathf.说明获取指定路径字符串的绝对路径也可以用GetFullPath.\,GetFullPath.\\例如:C:\Documents andSettings\Administrator\My Documents2获取和设置当前执行目录a说明获取启动了应用程序的可执行文件的路径・不包括可执行文件的名称常用于WinForm.例如:D:\Projects\MyTest\binHb System.AppDomain.CurrentDomain.BaseDirectory说明获取基目录,它由程序集冲突解决程序用来探测程序集返回路径末尾带“\”例如mD:\Projects\MyTest\bin\c说明获取或设置包含该应用程序的目录的名称返回路径末尾带例如:D:\P rojects\MyT est\bin\n3获取和设置当前执行目录,包括可执行文件名a System.Diagnostics.Process.GetCurrentProcess.MainModule.FileName说明获取模块的完整路径包括可执行文件的名称例如D:\Projects\MyTest\bin\MyTest.exe”b说明获取官动了应用程序的可执行文件的路径,包括可执行文件的名称例如,D:\P rojects\MyT est\bin\MyT est.exec System.Reflection.Assembly.GetExecutingAssembly.Location说明如果包含清单的已加载文件没有被影像复制,则获取该文件的基本代码格式的位置例如:D:\Projects\MyTest\bin\MyTest.exe”d System.Reflection.Assembly.GetExecutingAssembly.CodeBase说明获取最初指定的程序集的位置,例如,在对象中指定的位置例如f iIe:///D:/P rojects/MyT est/bi n/MyT est.exeH附2:vs主要是.Net中常用的各种类型的文件附sin:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息.csproj:项目文件,创建应用程序所需的引用、数据连接、文件夹和文件的信息.aspx:Web窗体页由两部分组成视觉元素(HTML、服务器控件和静态文本)和该页的编程逻辑Visual Studio将这两个组成部分分别存储在一个单独的文件中视觉元素在.aspx文件中创建.aspx.cs:Web窗体页的编程逻辑位于一个单独的类文件中,该文件称作代码隐藏类文件(.aspx.cs).cs:类模块代码文件业务逻辑处理层的代码.asax:Global.asax文件(也叫做ASP.NET应用程序文件)是一个可选的文件,该文件包含响应ASP.NET或HTTP模块引发的应用程序级别事件的代码.config:Web.config文件向它们所在的目录和所有子目录提供配置信息.aspx.resx/.resx:资源文件,资源是在逻辑上由应用程序部署的任何非可执行数据通过在资源文件中存储数据,无需重新编译整个应用程序即可更改数据.XSD:XML schema的一种.从DTD,XDR发展至IJXSD.pdb:PDB(程序数据库)文件保持着调试和项目状态信息,从而可以对程序的调试配置进行增量链接・su:解决方案用户选项,记录所有将与解决方案建立关联的选项,以便在每次打开时•它都包含您所做的自定义设置.asmx:asmx文件包含WebService处理指令•并用作XML Webservices的可寻址入口点.vsdisco(项目发现)文件基于XML的文件,它包含为Web服务提供发现信息的资源的链接(URL).htc一个HTML文件,包含脚本和定义组件的一系列HTC特定元素.htc提供在脚本中implement组件的机制.ascx是用户控件代码文件.aspx webformhtrrd脚本文件.cs是c#类文件).vb是vb类文件).aspx.cs和你的webform相今的后台c#代码文件,其实跟.cs是一样的.aspx.vb和你的webform相关的后台VB代码文件,其实跟.vb是一样的web.config配置文件.xml xml文件.css样式表文件。
个人认证
优秀文档
获得点赞 0