赞
踩
假设新建一个项目ssyy1,解决方案起名fangan,注意解决方案包括项目,此时生成的最外层目录为fangan代表整个解决方案的内容都在这个文件夹内。在这个fangan文件夹内包含有fangan.sln的解决方案配置文件和一个ssyy1文件夹,ssyy1文件夹代表整个ssyy项目的所有内容都在这个文件夹内,这个文件夹内含有ssyy1.vcproj的项目配置文件和.h头文件以及.cpp源文件。如果在fangan解决方案下再建立一个新项目名为ssyy2,则会在fangan文件夹下生成一个ssyy2文件夹存放ssyy2项目的所有内容。
如果没有单独给出解决方案名和项目名称的情况下,默认解决方案名称和项目名称相同,通常都是一个解决方案中仅包含一个项目。最好取名不相同,在创建好一个解决方案后可以再添加新的项目。
管理器(解决方案或项目)都会对应一个总的文件夹,这个管理器文件夹下存放本管理器的配置文件以及子管理器。比如,解决方案是个管理器,它的文件夹下含有.sln配置文件以及子管理器ssyy1项目和子管理器ssyy2项目。
默认情况下,项目属性设置的目录起点为项目配置文件所在位置,实际上就是项目头文件和源文件所在位置。
对于C++项目,则解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹和一个Debug文件夹以及一个Release文件夹(共个东东,其中Debug和Release文件夹中存放最终生成的结果exe或dll,要注意如果不使用Release生成,则不存在Release文件夹),而项目总文件夹下包含C++源文件头文件、项目配置文件和一个Debug文件夹以及一个Release文件夹(一定要注意,此处的Debug和Release文件夹仅仅存放中间编译结果obj,不存放exe和dll之类的东西。如果不使用Release编译,则没有对应的Release文件夹)。
fangan文件夹下:
结构如看起来比较变态
,想看就看。
解决方案就是Visual Studio中用来组织项目的结构。.sln文件包含基于文本编写的信息,可用ultraedit打开,编译环境通过这些信息找到并且加载他引用到的持久数据和VSPackages项目。当用户打开解决方案的时候编译环境通过包含在.sln文件中的preSolution,Project,postSolution信息加载解决方案,包含在解决方案中的项目以及任何和解决方案有联系的持久信息。
1.文件版本(运行平台信息)
Microsoft Visual Studio Solution File, Format Version 12.00
#Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
2.工程信息(包含的项目信息)
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = “ssyy1”, “ssyy1\ssyy1.vcxproj”, “{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}”
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = “ssyy2”, “ssyy2\ssyy2.vcxproj”, “{4773F960-EFEC-4C69-B583-671A3237EE72}”
EndProject
项目全局唯一标识符(GUID)以及项目类型的全局唯一标识符(GUID)
前面的"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"是项目类型全局统一标识符,项目的全局唯一标识符(GUID)被传递到IVsProjectFactory用来加载和项目有关的特殊的VSPackage,然后这个项目被载入。在上面的代码中被载入的VSPackage是Windows (Visual C++) ,因为我们创建的两个项目ssyy1、ssyy2都是Visual C++项目。
后面的"{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}"是项目实例全局唯一标识符,用于在该解决方案中标识该项目的唯一性。每个项目中都存在一个唯一的项目实例ID,只有这样这个项目才能被其他解决方案中需要他的项目使用。理想状态下,如果解决方案和项目在源代码控制之下,项目的路径应该和解决方案的路径是相关的。当解决方案被第一次加载时,项目文件不能够存在于用户的电脑中。将项目文件存放在和解决方案文件相关的服务文件中,通过这个方法将相对简单的找到项目文件或者将项目文件复制到用户的电脑中。然后编译环境复制并加载剩下的项目所需文件。
GUID是确定的值:
部分VS项目GUID罗列如下: Windows (C#) {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Windows (VB.NET) {F184B08F-C81C-45F6-A57F-5ABD9991F28F} Windows (Visual C++) {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} Web Application {349C5851-65DF-11DA-9384-00065B846F21} Web Site {E24C65DC-7377-472B-9ABA-BC803B73C61A} WCF {3D9AD99F-2412-4246-B90B-4EAA41C64699} WPF {60DC8134-EBA5-43B8-BCC9-BB4BC16C2548} XNA (Windows) {6D335F3A-9D43-41b4-9D22-F6F17C4BE596} XNA (XBox) {2DF5C3F4-5A5F-47a9-8E94-23B4456F55E2} XNA (Zune) {D399B71A-8929-442a-A9AC-8BEC78BB2433} Silverlight {A1591282-1198-4647-A2B1-27E5FF5F6F3B} ASP.NET MVC {F85E285D-A4E0-4152-9332-AB1D724D3325} ASP.NET MVC 4 {E3E379DF-F4C6-4180-9B81-6769533ABE47} Test {3AC096D0-A1C2-E12C-1390-A8335801FDAB} Solution Folder {2150E333-8FDC-42A3-9474-1A3956D46DE8}
3.全局设置(全局变量)
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}.Debug|x64.ActiveCfg = Debug|x64
{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}.Debug|x64.Build.0 = Debug|x64
{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}.Debug|x86.ActiveCfg = Debug|Win32
{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}.Debug|x86.Build.0 = Debug|Win32
{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}.Release|x64.ActiveCfg = Release|x64
{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}.Release|x64.Build.0 = Release|x64
{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}.Release|x86.ActiveCfg = Release|Win32
{D1345DA1-6889-443F-975E-8FB1FEFEC1BC}.Release|x86.Build.0 = Release|Win32
{4773F960-EFEC-4C69-B583-671A3237EE72}.Debug|x64.ActiveCfg = Debug|x64
{4773F960-EFEC-4C69-B583-671A3237EE72}.Debug|x64.Build.0 = Debug|x64
{4773F960-EFEC-4C69-B583-671A3237EE72}.Debug|x86.ActiveCfg = Debug|Win32
{4773F960-EFEC-4C69-B583-671A3237EE72}.Debug|x86.Build.0 = Debug|Win32
{4773F960-EFEC-4C69-B583-671A3237EE72}.Release|x64.ActiveCfg = Release|x64
{4773F960-EFEC-4C69-B583-671A3237EE72}.Release|x64.Build.0 = Release|x64
{4773F960-EFEC-4C69-B583-671A3237EE72}.Release|x86.ActiveCfg = Release|Win32
{4773F960-EFEC-4C69-B583-671A3237EE72}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
preSolution和postSolution分别是在solution启动前启动后执行的操作。
用vs2015创建Visual C++项目,编写生成后,每次都会生成一个project_name.VC.db文件,而且会随着你工程修改运行变的越来越大。
project_name.VC.db是sqlite后端用于百intellisense的新数据库,度相当于之前的*.sdf SQL Server Compact数据库。它与VS2015提供的智能感知、代码恢复、团队本地仓库内功能有关,VS重新加载解决方案时速度超快。如果不需要,可以禁止,就不会产生该文容件了。
如果你不想生成该文件或不需要生成该文件的话可以通过以下方式取消:
设置方法:工具–》选项–》文本编辑器–》C/C++–》高级,把回退位置和警告设置为true或者禁用数据库设为true,这样就不会产生那个文件了。
ssyy1文件夹
vcxproj是工程的配置文件问,管理工程中细节比如包含的文件,引用库等。一般没有sln,也答可以专直接打开vcxproj,也可以重新生成sln。
*.vcproj:VS2008以及VS2008之前版本的VS工程文件
*.vcxproj:VS2010以及VS2010之后版本的VS工程文件
*.vcxproj.filters就是用于项目下文件的虚拟目录,不能丢弃。可理解为视图文件,定义了工程在VS中打开后的目录结构,修改该文件后重新build时vs不会重新build工程。vcxproj.filters文件是过滤信息文件,解决方案中的筛选器文件就保存在此文件中。
vcxproj.user是本地化用户配置,允许多个用户使用自己喜好的方式配置这个项目(例如打开项目时候窗体位置等与项目内容无关的配置), 不需要添加到版本控制中。
在解决方案目录下的是最终文件(即可执行文件)存放的目录,在工程目录下的是中间文件(编译生成的.obj等其他文件)存放的目录,中间文件对用户来说没什么用的,只是在链接成最终文件时有用到。Debug只是为调试人员存在的。
ssyy1_main.obj文件: 由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。有几个cpp就生成几个obj文件,单独编译的,之间没有联系。因为每次编译都是增量编译,也就是只重新编译改变了的模块,所以这个obj目录的作用就是保存这些小块的编译结果,加快编译速度。
ssyy1.log文件: 日志记录文件,是文本内容。
ssyy1_main.cpp
ssyy1_cpp1.cpp
正在生成代码…
ssyy1.vcxproj -> D:\Cpp_excerise\fftw_test\fftw_test_64bit\fangan\Debug\ssyy1.exe
ssyy1.vcxproj -> D:\Cpp_excerise\fftw_test\fftw_test_64bit\fangan\Debug\ssyy1.pdb (Partial PDB)
ssyy1.Build.CppClean.log: 当点击“重新生成解决方案”的时候会有,否则没有。
ssyy1.tlog文件夹:相关记录文件,比如编译时候用到的库的头文件等;
.pdb 是存放代码中断点等调试信息的,程序的pdb既是输出文件又是输入文件,因为LINK在重新构建程序时更新pdb。
.idb 是记录了哪些文件是修改过的,需要重新编译的。
.pch 是预编译头文件,存放工程中较稳定的代码。
除了少一个vc140.idb文件,其他的和ssyy1/Debug功能一样。
在64平台上重新运行了一遍,和32平台上一样的过程。
调试版本,包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试。Debug只是为调试人员存在的。
.ilk文件:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信。
发布版本,不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小和运行速度上都是最优的。
在一个解决方案(solution)中是可以添加多个项目(project)的,这多个项目之间存在两种关系:1.项目间彼此独立,各自有各自的入口,只是组织在一个解决方案中便于管理;2.项目间存在相互调用,只存在一个入口。
项目间彼此独立,每个项目都有自己的入口,则同一时间解决方案只能有一个活动入口,相当于只有一个项目存在,通过设置可以选择哪个项目作为活动项目,则之后的编译、运行都是针对该项目的。
更改方法:在选择的项目名上右键选择“设为启动项目。变成粗黑体就可以了。
在 生成->配置管理器 中,可以给每个项目设置单独的运行平台,互相之间不干扰。
一个解决方案包含多个项目,其中一个主项目,依赖其余数个子项目的库文件,我们希望每次只需要编译主项目,就能自动编译依赖项目。
在vs2015项目中,选中“解决方案”的属性,如下图所示,可以确定各个项目依赖关系。
下面在ssyy2项目中引用ssyy1项目:
VS 中项目引用或第三方包引入需要处理3个部分:
A.解决方案属性配置
解决方案属性-》通用属性-》项目依赖项-》ssyy2依赖于ssyy1;
B. 头文件:
C. 库文件:
运行成功~
Okay, Let’s enjoy it~
本篇blog主要是参考以下网页链接,感谢各位作者们的工作。
https://www.cnblogs.com/alinh/p/8066820.html
https://blog.csdn.net/baidu_39511645/article/details/78423725
https://www.cnblogs.com/beijiguangyong/archive/2011/06/02/2302768.html
https://blog.csdn.net/weixin_33859844/article/details/93763799
https://www.cnblogs.com/hustdc/p/6538510.html
https://blog.csdn.net/qq_20828983/article/details/75593441
http://ask.zol.com.cn/x/10710931.html
ps:由于文章写转载的时候只能填写一个链接,所以只选取我认为参考最多的那个链接作为转载链接。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。