VC2010 C ++-组织源文件


68

我对如何在VC 2010 C ++项目中组织源文件有一些疑问。最终所包含的默认过滤器将不够用,因为我将拥有大量的.cpp和.hpp文件,因此会变得凌乱。我想在项目的根目录下创建一个名为“源”的文件夹,然后在“源”内为我要使用的各种源文件类别创建文件夹。右键单击解决方案时,我只能选择添加过滤器,而不是文件夹。我可以在Windows资源管理器中手动创建文件夹,然后将其包括在内,但是随后我失去了添加过滤器的能力。有没有一种方法可以添加新文件夹(不使用Windows资源管理器)并且仍然使用过滤器?

此外,是否有类似于$(CURDIR)的东西可以用来包含源文件文件夹而无需绝对路径?

先谢谢您的帮助

Answers:


156

您对Visual Studio如何使用C ++文件感到有些困惑,但这没关系,因为文档很糟糕。首先,第一件事:与C#或Java不同,项目中文件的排列与磁盘上文件的排列无关。文件和文件夹实际上不在项目中。该项目仅列出磁盘上必须已经存在的文件和文件夹的名称和路径。

通常,您创建文件夹的布局,并在这些文件夹中包含源文件。您可以Visual Studio之外执行此操作。您还将创建一个项目文件。当您向项目“添加文件”时,您要做的就是告诉项目在磁盘上找到文件的位置。

让我们来看一个具体的例子,我将向您展示如何组织它。假设您正在制作一个名为SuperCalc的图形计算器程序。您将拥有一个Source文件夹,然后在Source内创建文件夹以容纳不同的文件。假设您创建的文件夹是:

  • SuperCalc\Source\Input
  • SuperCalc\Source\Math
  • SuperCalc\Source\Math\Matrix
  • SuperCalc\Source\Output

你有3个子目录SourceInputOutput,和Math。该Math子目录有一个名为的子目录Matrix。输入,数学,矩阵和输出中将包含.cpp文件。您将使用Windows资源管理器或命令提示符创建这些目录(文件夹)。

现在,您还需要创建一个解决方案文件(SuperCalc.sln)和一个项目文件(SuperCalc.vcxprojSuperCalc.vcxproj.filters)。在Visual Studio中执行此操作。通常,项目文件位于解决方案目录的子文件夹中。这将由Visual Studio自动为您完成。选择解决方案文件的位置-它应该与源代码在同一目录结构(文件夹树)中的某个位置。我建议将其放在Source目录的旁边,在:

  • SuperCalc\Build

进入VS并选择File > New > Project > Visual Studio Solutions > Blank Solution File。给解决方案命名(可能是“ SuperCalc”)和位置(我们刚刚在SuperCalc\Build目录中选择的位置)。它将为您创建解决方案文件。

现在,在解决方案资源管理器中右键单击解决方案(“解决方案SuperCalc,0个项目”),然后选择Add > New Project。选择一个名称-这将是您的程序可执行文件的名称,例如“ SuperCalc”!选择Win32Win32控制台应用程序(这是一个DOS控制台程序)或Win32 Project(这是一个普通的Windows GUI程序)。通常,然后我单击“应用程序设置”进行一些重要更改:一方面,我选择“空项目”,因为除非我告知,否则我不希望Visual Studio为我创建文件和代码。当所有设置完成后,我单击“完成”。

现在,您有了由Visual Studio创建的解决方案文件和项目。您还可以在Visual Studio外部创建您的源代码,或至少要在其中创建源代码的目录结构(文件夹树)。现在是将这两件事联系在一起的时候了。

如果需要,可以将所有源文件列出到项目的“源文件”过滤器中。即使它们来自不同的目录(Input,Matrix等),磁盘上文件的位置与其在项目中的外观之间也不存在必需的关系。但是,如果您有很多文件,则创建“子过滤器”,在“源文件”过滤器内过滤并为它们指定“源”子文件夹的名称会更容易。这样,您就可以在项目文件中复制磁盘目录的结构。

右键单击“ SuperCalc”项目的“源文件”过滤器,然后选择“添加”>“添加新过滤器”。为其命名Input(SuperCalc \ Source目录的第一个)。还要创建过滤器MathOutput。右键单击Math过滤器,然后选择“添加”>“添加新过滤器”,以创建一个名为Matrix(在Math的内部)的子过滤器。现在您有了以下过滤器

   超级计算器
      源文件
         输入值
         数学
            矩阵
         输出量

与您先前创建的目录(文件夹)平行。 这纯粹是对人类的方便安排。Visual Studio不了解有关它的任何特殊信息。如果仅告诉VS“添加文件”,则不会将文件放入正确的过滤器中。您必须告诉它放在哪里。

要添加或创建您的.cpp文件,请选择与.cpp文件所在目录相对应的过滤器名称。因此,要添加或创建文件 SuperCalc\Source\Math\Matrix\matrix_multiply.cpp,请Matrix在解决方案资源管理器中右键单击过滤器,然后选择“添加”>“添加新文件”或“添加现有文件”。(“添加现有文件”适用于已经编写了matrix_multiply.cpp并且只想告诉项目在哪里的情况。)使用对话框导航至Source\Math\Matrix目录。对整个程序中的所有源文件重复此过程。

您还存在一个问题:“是否可以使用$(CURDIR)来包含源文件文件夹而不需要绝对路径?” 真幸运:Visual Studio项目不使用绝对路径!他们使用相对路径。项目文件存储从包含.vcxproj文件的目录到包含源文件的目录所需的相对路径。所以,如果你创建SuperCalc.slnSuperCalc.vcxproj在那里我建议(该SuperCalc\Build目录),并且您在源子目录中添加.cpp文件,您可以使用记事本去看看的SuperCalc.vcxproj文件里面,你会看到这样几行:

<ClCompile Include =“ .. \ .. \ .. \ Source \ Math \ Matrix \ matrix_multiply.cpp” />

由于没有绝对路径,因此您可以将整个SuperCalc目录树移到其他位置,并且仍然可以使用。不需要$(CURDIR)之类的环境变量黑客。

最后要知道的一件事:由于将源文件放在多个目录中,因此#includeing标头(.h或.hpp文件)可能会遇到问题。您必须告诉编译器头文件所在的目录。它们可能分散在多个目录中。因此,编辑项目设置:在解决方案资源管理器中右键单击项目名称,选择“属性”,然后向下钻取到“配置属性”>“ C / C ++”>“常规”。属性表中的第一个字段为“其他包含目录”。 在执行其他操作之前,请单击“配置”下拉菜单,然后选择“所有配置”。如果同时具有32位和64位版本,请单击“平台”下拉菜单,然后选择“所有平台”。。现在转到“其他包含目录”,并将所有路径添加到所有源目录,并指定相对于项目文件目录的路径。因此,对于SuperCalc示例,它看起来像:

.. \ .. \ .. \ Source \ Input; .. \ .. \ .. \ Source \ Math; .. \ .. \ .. \ Source \ Math \ Matrix; .. \ .. \ .. \源\输出

进行此更改后,Source \ Math \ Matrix \ matrix_multiply.cpp之类的文件可以包含一行

#include "input_configuration.hpp"

从输入目录中#include一个文件,它将全部正常工作。

(如果并非所有方法都可行,通常的方法是返回“项目属性”,并..\在“其他包含目录”前面摆弄序列数。 请记住,每次进行更改时,都必须选择“所有配置”再次-否则您的更改将仅适用于当前配置(调试或发行版)。该设置不固定。)


1
另外,您可以定义用户宏,例如。$(源)通过属性表(.props)。我建议在属性表中进行尽可能多的项目设置,因为许多项目可能共享设置。
本L

2
好答案。我创建了与目录结构匹配的过滤器,但是又遇到了反复出现的麻烦,您对此有些感触。VS不知道我的过滤器已链接到目录。当我依次添加代码时,这会很麻烦:foo.h,foo.c,bar.h,bar.c。我必须记住要始终将目录更改到正确的位置。VC ++会记住您的上一个目录,因此它始终落后一步。我向MS发布了一项建议,允许将目录与过滤器相关联。是这里。如果这也会打扰您,请反对该建议。tinyurl.com/bud4zsv
bigh_29年

1
甜!在2015年社区中,新的>项目...>其他项目类型> Visual Studio解决方案>空白解决方案下是一个空的解决方案
Ryan S

24

实际上,可以通过Visual Studio查看(和操作)物理文件结构,如本SO文章所述

标题/源文件不是Visual Studio强制要求的。那只是默认布局,它是虚拟的,而不是物理的。如果在解决方案资源管理器中单击“显示所有文件”,它将显示硬盘驱动器上的文件夹树,您可以根据需要进行操作。


1
你让我开心!非常感谢你!我只有一个问题:defaut为什么不将其设置为空项目?@thomthom“我一直在寻找这样的解决方案已有几个小时了!” -我也是)
Maks 2015年

3

我来晚了,但我建议不要接受这个答案。代码可移植性的主要原因。相反,我建议:

  1. 在Visual Studio外部创建文件夹和子文件夹的布局(与接受的答案相同,但以下几点不同)。在每个子文件夹内创建一个includesrc文件夹
  2. 然后在配置属性> C / C ++>常规>“附加包含目录”(针对所有配置和所有Plateforms)添加一个单一的文件夹,这是所有子文件夹的基础。
  3. 要添加src文件,并将文件包含在这些子文件夹中。

  4. 最后,使用 此基本文件夹的相对路径包含每个头文件。

要明确的是:如果您的项目的布局如下:

MyProjet
   Math
     include
       random.h
       functions.h
     src
       random.cpp
       functions.cpp
   Probability
      include
        normal.h
      src
        normal.cpp

您应该在functions.cpp以下包含声明中包含以下内容:

#include"Math/include/functions.h"

如果您还需要使用normalfunctions.cpp中的代码,则顶部functions.cpp应如下所示:

#include"Math/include/functions.h"
#include"Probability/include/normal.h"

这样,您就可以轻松地在另一个项目(B)中重用Math子文件夹:只需将MyProject基本文件夹添加到项目B的“其他包含目录”中即可。

关键点是只有一个基本文件夹进入“其他包含目录”属性。

ps:VS 2015的智能功能有助于编写 #include...


3
这非常脆弱。最好将搜索目录提供给编译器,而不是将源代码头中听到的代码头路径提供给编译器。
ThomasMcLeod

1
我只是看了看Google的Skia库,他们使用了包含深层次子文件夹的include语句中的完整路径。我宁愿查看而#include "superlib/defines.h"不是#include "defines.h" // I don't know where this came from
Erik Bongers

0

使用诸如CMakePremake之类的构建系统在组织文件时可能会有所帮助,并且具有帮助您将代码移植到其他平台的额外好处。是一个很好的主题演讲。

由于可能会对某人有所帮助,我还应该补充一点,将源文件与项目文件(*.vcxproj)分开会使创建新文件更加困难,因为Visual Studio默认情况下希望在与您的文件夹相同的文件夹中创建新文件。项目。到目前为止,解决此问题的方法是使用Visual Assists扩展,因为它允许添加相对于目录或当前打开的文件的新文件。有关更多说明,请参见此帖子。


-3

如果确实要在与源代码不同的位置创建解决方案和项目,则可以更改工作目录:

Project > Properties > Configuration Properties > Debugging > Working Directory

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.