1. 概述
这篇主要讲的是建立C++项目的方法和一些配置,这些对每个人来说,不一定是最好的设置,但是可做参考。
2. 案例
刚刚打开Visual Studio
这是开始页,什么都没有,我们还没有找到任何解决方案。
1. 创建项目
接下来,我们创建一个全新的项目和解决方案。
工具栏->文件(F)->项目(P)
在模版Visual C++选择创建一个空项目
名称(N)
栏:给项目起一个项目名。我这里起的名字是NewProject。
位置(L)
栏:创建项目所在的本地目录。自定义即可
为解决方案创建目录(D)
选项: 勾选会自动创建项目名称文件夹,也就是说勾选了这个选项,位置栏的最后一层目录可以不用写项目名
解决方案名称(M)
栏:默认和名称
相同,勾选为解决方案创建目录(D)
选项后,才可编辑,会在位置(L)
栏后添加一层目录。
点击确定后便创建好项目了
可以看到解决方案管理器目录树中没有文件。
2. 创建项目生成磁盘文件及目录简介
鼠标右键项目
->在文件资源管理器中打开文件夹(X)
项目名称目录
:
其中创建项目时
位置(L)
:
解决方案名称(M)
:
项目名称(N)
:
在这里可以看到实际的目录结构
解决方案目录
:
可以看到Visual Studio做的一些事情,它将我们的解决方案的名字和项目名称搞成一样的了。这应该不是我们想要的,如果这个解决方案只有一个项目,一样或许没什么。但是,解决方案和项目名称相同的这种情况并不是很常见,比如在做游戏类的项目时。
不过这种默认的结构实际上也不算坏,我们有一个专门用于项目的文件夹
里面有vcxproj
文件以及vcxproj.filters
文件,这里暂时不会对所有VS生成的文件做详细解释。
vcxproj文件
:我们的项目文件,只是一个xml文件。
回到解决方案目录
.sln
文件:解决方案文件。看上去是一个奇怪的文件格式,其实它是一种结构,组织项目的结构,就像是某种目录。
3. 筛选器(过滤器)
回到VS
可以注意到,这里有一堆不同的文件夹。其实,这些并不是文件夹,而是一些过滤器
,过滤器
不是文件夹。
如果我右键项目
->添加(D)
->新建筛选器(F)
看到的是新建筛选器
而不是新建文件。如果我们新建一个筛选器C
然后去项目目录
查看
可以看到磁盘什么都没有改变,并没有新增目录。
这个文件过滤器,包含了我们创建这类虚拟文件,如头文件过滤器下存放头文件,源文件下存放cpp文件等。这些过滤器组织了你的源代码。但是这些目录在磁盘上实际是不存在的,只是虚拟目录。且它们确实是存在于这个解决方案资源管理视图中
例如,我在源文件
过滤器中创建一个新的文件。
源文件
过滤器不是一个文件夹,如果我添加了一个main.cpp文件。
打开项目目录
。
可以看到,一旦在过滤器
中创建了文件,你会看到它实际是创建在我们的项目文件边上,也就是项目目录下。
这个看起来代码分类没有组织起来,有点乱。
所以我们可以创建一个名为Source或是src的文件夹,在里面存放源代码,头文件等等,当然src更符合我们的习惯。这使得我们的项目文件和其他可能使用的其他任何资源可以被很好的分开在不同的文件夹中。
以上是Visual Studio自动设置的。所以下面,我们需要自己设置。
4. 显示所有文件按钮
回到VS
我们可以选中VS
可以看到解决方案资源管理器下面有这么个按钮,鼠标放上去可以看到提示显示所有文件
。如果我们点击它,选中这个按钮。
可以看到视图发生了改变。现在我们看到的就是实际硬盘里面的目录结构。
我们右键项目
->添加(D)
->新建文件夹(D)
可以看到,这个时候,之前的新增筛选器(F)
变成了新建文件夹(D)
我们可以创建一个名为src
的文件夹。
现在,渠道磁盘的项目目录
查看
5. 磁盘目录拖动文件和VS中拖动文件
1. 磁盘目录中拖动文件
我们可以将Main.cpp文件拖入到src目录下
但是,我们会到VS,观察解决方案资源管理器
目录
发现VS中的解决方案资源管理器
目录这里并没有更新。
回到磁盘项目目录现在是如下样子
我们还是将src中的Main.cpp文件移出来放回到项目目录,恢复一下
回到VS
会显示文件位置改变了,需要更新下,我们点击是(Y)
好,现在恢复成开始的拖动Main.cpp文件之前的样子了。
2. VS中拖动文件
现在让我们在VS中拖动Main.cpp文件到src目录下
然后到磁盘目录下观察
可以看到磁盘目录文件位置更新了。
这种显示所有文件按钮非常好用,所以,我经常使用这个。
我们取消选中按钮
可以看到Main.cpp文件仍然在源文件
筛选器(过滤器)中。
所以筛选器
只是一种虚拟组织
的方案。我们也可以将Main.cpp文件拖动到头文件筛选器下。文件在哪个筛选器下并不重要,也可以不放在筛选器下。也就是说文件在哪里都可以。实际上,我们甚至可以将这些筛选器(过滤器)
都删掉,这些都不重要,筛选器(过滤器)视图
就是这样,都是假的,一种虚拟组织目录
。这些筛选器(过滤器)的目的用来让你把文件资源分好组,它和磁盘上实际的目录结构没有关系。
好了,我们回到VS解决方案资源管理器
,将按钮处于选中状态
我们可以在我们的Main.cpp文件中完善我们的代码,写一个简单的Hello World
程序。
右键项目生成
可以看到,所有东西都构建成功。
6. 默认的输出目录和中间目录
接下来,我们看看VS默认会把生成的exe文件放在哪。
从刚刚生成后的输出窗口信息可以看到exe文件的目录
debug是当前选择的配置
我们回到磁盘中的项目目录
可以看到,这里多出了一个Debug
目录
我们点击进去
这里是没有exe文件的。
我们回看下,项目编译生成的输出
G:\LHY\C\demo\NewProject\Debug\NewProject.exe
可以看到,这个exe文件所在的debug目录是在解决方案目录
(G:\LHY\C\demo\NewProject)下
可以看到,除了项目目录
下多出了一个debug目录外,解决方案目录
下,也多出了一个debug目录。
我们进入到解决方案目录
下的debug
可以看到生成的exe文件。
这个默认的生成文件存放路径感觉有点点奇怪。实际上,VS把中间文件放到了项目目录下的debug目录下
,而把最终的二进制可执行文件放到了解决方案目录下的debug目录下
。所以我们一般会改动这个默认的生成配置。
改变这些并不是什么大问题,我们可以创建模版之类的东西。
7. 项目属性输出目录和中间目录介绍
回到VS
进入项目属性
在配置属性
->常规
中
可以看到,输出目录、中间目录等配置信息。
输出目录
:指定输出文件目录的相对路径;可以包含环境变量。
中间目录
:指定中间文件目的相对路径;可以包含环境变量。
可以看到,这里写的东西都是相对于项目文件vcsproj
,也就是项目目录
路径来说的。
1. 指定配置和平台设置输出目录和中间目录
如果我们修改输出目录为output
,修改中间目录为target
,那这个意思就是,在项目文件vcsproj
所在目录也就是项目目录
分别创建一个output目录来存储所有生成的二进制可执行文件和创建一个target目录来存放所有生成的中间文件。
点击确定
然后右键编译项目
打开项目目录
可以看到生成了output
目录和target
目录。
可见项目属性配置中常规下的输出目录
和中间目录
中设置的相对路径都是相对于项目文件vcsproj
而言的相对路径。
现在删掉output目录和target目录
回到VS项目属性配置
将输出目录
和中间目录
还原。
输出目录
: $(SolutionDir)$(Configuration)
中间目录
: $(Configuration)
2. 所有配置和平台设置输出目录和中间目录
因为我们想要修改的是输出路径,肯定是想改所有所有平台和配置,如下切换到所有配置
和所有平台
现在我们可以自定义输出目录的相对路径,我这里的习惯是放在解决方案目录
下的bin目录下的$(Platform)
下的$(Configuration)路径下。
$(SolutionDir)bin\$(Platform)\$(Configuration)
$(SolutionDir)
:指的是解决方案路径
$(Platform)
:指的是编译生成时所处的平台
(Win32\x64)
$(Configuration)
:指的是编译生成时所处的编译模式
(Debug\Release)
这里为什么选择在解决方案目录
,因为如果我们有多个项目,比如我们构建我们的主应用程序需要DLL文件,我们希望它们都在一个文件夹中对吧。我可不想在每个项目文件夹下去处理这些输出文件。我只是想要把我所有构建的二进制文件放在一个地方。至于我们在解决方案目录下的bin目录,bin的意思就是二进制的意思。然后就是在合适的$(Platform)
平台文件夹下,这平台目录就看编译时所处的是哪个平台,有Win32
和x64
两个选项。然后就是合适的$(Configuration)
配置文件夹下,这个配置目录就看编译时所处的编译模式,有Debug
和Release
。
现在再来看中间目录
设置,和输出目录很相似,唯一的区别就是在bin
目录里面,加了一个名为intermediates
的文件夹。加上$(Platform)
和$(Configuration)
路径会更清楚些,能够复制和保存这些中间文件到你想要的平台和配置,那里只有构建好的二进制文件,没有中间文件。点击确定。
右键项目,点击清理
删除之前生成的旧文件,但是这样删除得不是很干净,我们可以到磁盘目录中手动删除掉我们不关心的文件。
解决方案目录
下:
项目目录
下:
删除后的目录
解决方案目录
下:
项目目录
下:
在回到VS,右键项目生成
我们回到磁盘的解决方案目录
下
可以看到生成了bin文件夹,进入到bin文件夹
可以看到中间目录
intermediates
和输出目录
平台目录Win32
。
中间目录
intermediates
一直点击进去
可以看到输出的中间文件都在这了。
输出目录Win32
一直点击进去
可以看到我们的可执行exe文件。
8. 宏变量
拓展一下,目录宏变量,像上面使用到的$(SolutionDir)
$(Platform)
$(Configuration)
这些变量都是宏变量,
我们可以在项目属性中查看这些变量。
在项目属性
->常规
->输出目录
\中间目录
设置相对目录输入栏最右边有个下拉选项按钮,点击编辑
可以看到宏视图
。
可以看到上面那一行
$(SolutionDir)bin\$(Platform)\$(Configuration)\
是我们输入进去的
下面那一行
G:\LHY\C\demo\NewProject\bin\Win32\Debug\
是VS计算得出的
我们继续点击宏(M)
,展开宏视图
可以看到每个宏对应的值,其中也有环境变量
第三行可用来搜索宏变量,如我们之前有用到$(SolutionDir)
可以看到这个解决方案的值对应的绝对路径。且这个绝对路径后面是已经带来\
的,所以我们设置输出目录
和中间目录
时的bin目录时$(SolutionDir)bin
中间没有加\
。