2011-03-16 135 views
59

我有一些关于如何在VC 2010 C++项目中组织源文件的问题。包含的默认过滤器最终还是不够,我将会有很多.cpp和.hpp文件,所以它会变得很混乱。我想在名为“source”的项目根目录下创建一个文件夹,然后在“源”中为我想要使用的各种源文件类别创建文件夹。当我右键点击解决方案时,我只能选择添加过滤器,而不是文件夹。我可以在Windows资源管理器中手动创建文件夹,然后包含它们,但是然后我失去了添加过滤器的能力。有没有办法添加新的文件夹(不使用Windows资源管理器),仍然使用过滤器?VC2010 C++ - 组织源文件

此外,有没有类似于$(CURDIR),我可以用来包含源文件文件夹而不需要绝对路径?

在此先感谢您的帮助

回答

143

你是一个有点困惑Studio如何目视着C++文件工作,但没关系,因为该文件是糟糕的。第一件事情:与C#或Java不同,项目中文件的排列与磁盘上文件的排列无关。文件和文件夹不是“在”项目中,真的;该项目只列出了文件和文件夹的名称和路径,这些文件和文件夹必须已经存在于您的磁盘上。

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

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

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

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

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

  • SuperCalc\Build

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

现在右键单击Solution Explorer中的解决方案(“Solution SuperCalc,0个项目”),然后选取Add > New Project。选择一个名称 - 这将是您的程序可执行文件的名称,如“SuperCalc”!选择Win32,或者Win32控制台应用程序(这是一个DOS控制台程序)或Win32项目(这是一个普通的Windows GUI程序)。通常我会点击应用程序设置进行一些重要的更改:首先,我选择Empty Project,因为我不想让Visual Studio为我创建文件和代码,除非我告诉它。当它按照我想要的方式设置时,我点击FINISH。

现在,您已经获得了由Visual Studio创建的解决方案文件和项目。您还拥有您的源代码,或者至少是您的源代码所在的目录结构(文件夹树),在Visual Studio之外创建。现在是把这两件事联系在一起的时候了。

如果需要,可以将所有源文件列入项目的源文件过滤器。即使它们来自不同的目录(输入,矩阵等),磁盘上文件的位置与它们在项目中的外观之间也没有必要的关系。但是,如果您有很多文件,那么创建“子过滤器”,在“源文件”过滤器内部进行过滤,并为它们提供源的子文件夹的名称会更容易。这样,您就可以在项目文件中复制磁盘目录的结构。

右键单击“SuperCalc”项目的源文件筛选器,然后选择添加>添加新筛选器。给它起一个名字Input(SuperCalc \ Source目录中的第一个)。还要创建过滤器MathOutput。右键单击Math过滤器并选择添加>添加新过滤器,以创建一个名为Matrix(Math内部)的子过滤器。现在你有这些过滤器

 
    SuperCalc 
     Source Files 
     Input 
     Math 
      Matrix 
     Output 

它平行的目录(文件夹)之前创建。 这纯粹是人类便利的安排。 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目录),并且将源文件添加到源子目录中,则可以查看SuperCalc。使用vcxproj文件记事本,你会看到线,如:

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

由于没有绝对路径,你可以把整个SuperCalc目录树和别的地方移动它,它都会仍然可以工作。不需要像$(CURDIR)这样的环境变量。

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

 
..\..\..\Source\Input;..\..\..\Source\Math;..\..\..\Source\Math\Matrix;..\..\..\Source\Output 

一旦做出改变,就像来源\数学\矩阵\ matrix_multiply.cpp一个文件可以有一个 线

#include "input_configuration.hpp" 

到#包括来自Input目录的一个文件,它将全部工作。

(如果不是所有刚工作时,通常的做法是重新回到项目属性和小提琴与..\序列的数目在附加包含目录的前面。记住,每次你去作你必须选择改变所有配置再次 - 。否则你的改变将只适用于当前配置(调试或释放)该设置不粘腻

+1

此外,您还可以定义用户宏如。 $(源)通过属性表(.props)。我建议尽可能多地在属性表中设置项目设置,因为许多项目可能会共享设置。 – 2012-06-11 20:16:12

+1

很好的答案。我创建了与我的目录结构相匹配的过滤器,但我遇到了一个经常性的头痛问题,您稍微触及了一下。 VS不知道我的过滤器是链接到目录。当我按顺序添加代码时,这会变得很痛苦:foo.h,foo.c,bar.h,bar.c.我必须记住不断更改目录到正确的位置。 VC++会记住你的最后一个目录,所以它总是落后一步。 我向MS发布了一个建议,允许将目录与过滤器相关联。是这里。如果这也让你感到厌倦,请提高这个建议。 http://tinyurl.com/bud4zsv – 2013-03-07 22:59:04

+1

甜!在2015年的社区中,一个空的解决方案是在新的>项目...>其他项目类型> Visual Studio解决方案>空白解决方案 – 2015-07-28 16:16:34

-2

如果你想创建解决方案,项目与您的源代码不同,您可以更改您的工作目录:

Project > Properties > Configuration Properties > Debugging > Working Directory

21

它实际上是可能的,以查看(和操作)通过Visual Studio中物理文件结构,如在this SO post描述:

页眉/源文件不是由Visual Studio强加的要求。 这只是默认布局,它是虚拟的,而不是物理的。如果您在解决方案资源管理器中单击“显示所有文件”,它将显示 文件夹树,因为它位于硬盘驱动器上,您可以将其操作为 ,您认为它合适。

+1

您已经度过了我的一天!非常感谢你! 我只有一个问题:为什么它不是通过默认设置空洞? @thomthom“我几个小时都在寻找这样的解决方案!” - 我也是) – Maks 2015-03-18 10:34:19

0

使用构建系统如CMakePremake整理文件的时候可以帮助,它在帮助你自己的代码移植到其他平台的好处。 Here是关于这个问题的一个很好的介绍。

因为它可能对某人有所帮助,所以我还应该补充说,将源文件与项目文件分开(*.vcxproj)使创建新文件变得更加困难,因为Visual Studio默认想要在与您的项目相同的文件夹。到目前为止我发现的这个问题的解决方法是使用Visual Assists扩展,因为它允许相对于目录或当前打开的文件添加新文件。有关详细说明,请参阅this

0

我晚了,但我建议对接受的答案。主要原因是如果对代码可移植性。相反,我建议:

  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" 

,如果您还需要在functions.cpp中使用normal代码,那么functions.cpp的顶部应如下所示:

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

这样做,你就可以无痛苦重新使用你的数学子文件夹中的另一个项目(B):刚刚加入MyProject基础文件夹到“附加包含目录”的项目B的

关键是要将一个基文件夹放入“Additional Include Directories”属性中。

PS:2015年VS的智能感知功能有很大帮助写#include...

+1

这很脆弱。最好将搜索目录提供给编译器,而不是将代码头路径读入源文件。 – ThomasMcLeod 2017-04-21 14:10:30