VC2010 C ++ – 组织源文件

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

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

先谢谢您的帮助

您对Visual Studio如何使用C ++文件有点困惑,但没关系,因为文档很糟糕。 首要的事情:与C#或Java不同,项目中文件的排列与磁盘上文件的排列无关。 文件和文件夹不是“在”项目中,真的; 该项目只列出文件和文件夹的名称和path,这些文件和文件夹必须已经存在于磁盘上。

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

让我们来看一个具体的例子,我会告诉你如何组织它。 假设你正在制作一个名为SuperCalc的graphics计算器程序。 您将有一个Source文件夹,然后在Source内部创build文件夹来保存不同的文件。 假设你创build的文件夹是:

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

你有3个子目录: InputOutputMathMath子目录有一个名为Matrix的子目录。 您将在input,math,matrix和输出中具有.cpp文件。 您将使用Windows资源pipe理器或命令提示符创build这些目录(文件夹)。

现在您还需要创build一个解决scheme文件( SuperCalc.sln )和一个项目文件( SuperCalc.vcxprojSuperCalc.vcxproj.filters )。 在Visual Studio里面做。 通常,项目文件位于解决scheme目录的子文件夹中; 这将由Visual Studio自动完成。 为解决scheme文件select一个位置 – 它应该位于与源代码相同的目录结构(文件夹树)中。 我build议把它放在源目录旁边,在:

  • SuperCalc\Build

进入VS并selectFile > New > Project > Visual Studio Solutions > Blank Solution File 。 给解决scheme一个名字(也许是“SuperCalc”)和一个位置(我们刚刚在SuperCalc\Build目录中select的位置)。 它将为您创build解决scheme文件。

现在,右键单击解决scheme资源pipe理器中的解决scheme(“Solution SuperCalc,0个项目”),然后selectAdd > New Project 。 select一个名称 – 这将是您的程序可执行文件的名称,如“SuperCalc”! selectWin32 ,无论是Win32控制台应用程序 (这是一个DOS控制台程序)或Win32项目 (这是一个普通的Windows GUI程序)。 通常我会点击应用程序设置进行一些重要的改变:一方面,我select空项目,因为我不想让Visual Studio为我创build文件和代码,除非我告诉它。 当它按照我想要的方式设置时,我点击“完成”。

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

如果你愿意,你可以列出所有的源文件到你的项目的源文件filter。 即使它们来自不同的目录(input,matrix等),磁盘上文件的位置和它们在项目中的外观之间也没有必要的关系。 但是,如果您有大量文件,则创build“子filter”,在“源文件”filter内部进行过滤,并为其指定源的子文件夹的名称会更容易。 这样,您就可以在项目文件中复制磁盘目录的结构。

右键单击“SuperCalc”项目的源文件筛选器,然后select添加>添加新筛选器。 给它起名字Input (SuperCalc \ Source目录的第一个)。 同时创buildfilterMathOutput 。 右键单击Mathfilter并select添加>添加新filter,以创build一个名为Matrix (math内)的子filter。 现在你有这些filter

    SuperCalc
      源文件
         input
         math
            matrix
         产量

与之前创build的目录(文件夹)相似。 这纯粹是人类的一种方便的安排 。 Visual Studio不了解任何特别的东西。 如果你只是告诉VS“添加文件”,它不会把文件放在正确的filter中。 你必须告诉它把它放在哪里。

要添加或创build.cpp文件,请select与.cpp文件所在目录对应的筛选器名称。 因此,要添加或创build文件SuperCalc\Source\Math\Matrix\matrix_multiply.cpp ,请在解决scheme资源pipe理器中的Matrixfilter上单击鼠标右键,然后select添加>添加新文件或添加现有文件。 (“添加现有文件”适用于已经写入matrix_multiply.cpp的情况,而您只是想告诉项目在哪里。)使用对话框导航到Source\Math\Matrix目录。 对整个程序中的所有源文件重复这个过程。

你也有这样的问题:“是否有类似于$(CURDIR)的东西,可以用来包含源文件文件夹而不需要绝对path? 你很幸运:Visual Studio项目不使用绝对path! 他们使用相对path。 项目文件存储从包含.vcxproj文件的目录到包含源文件的目录所需的相对path。 因此,如果您创build了SuperCalc.slnSuperCalc.vcxprojSuperCalc\Build目录),并且在源子目录中添加了.cpp文件,则可以使用记事本查看SuperCalc.vcxproj文件,会看到如下行:

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

由于没有绝对path,你可以把整个SuperCalc目录树移动到别的地方,它们都可以工作。 不需要像$(CURDIR)这样的环境variables。

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

 .. \ .. \ .. \源\input; .. \ .. \ .. \源\math; .. \ .. \ .. \源\math\matrix; .. \ .. \ .. \来源\输出

一旦做了这个改变,像Source \ Math \ Matrix \ matrix_multiply.cpp这样的文件就可以有一行

 #include "input_configuration.hpp" 

从#input目录中包含一个文件,它将完全正常工作。

(如果它不是全部工作,通常的做法是返回到Project Properties,并在你的其他包含目录前面找出..\ sequence的数量。 记住 ,每当你去做一个改变,你必须再次select所有configuration – 否则您的更改将仅适用于当前的configuration(debugging或发布),该设置不粘

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

标题/源文件不是由Visual Studio强加的要求。 这只是默认的布局,而且是虚拟的,而不是物理的。 如果您在解决scheme资源pipe理器中单击“显示所有文件”,它将显示文件夹树,因为它在硬盘驱动器上,您可以根据需要操作。

使用构build系统(如CMake或Premake)可以在组织文件时提供帮助,并且还有助于将代码移植到其他平台。 这是关于这个问题的一个很好的介绍。

因为它可能对某人有所帮助,所以我还应该补充说,将源文件与项目文件( *.vcxproj )分开使得创build新文件变得更加困难,因为Visual Studio默认情况下要创build新文件文件夹作为您的项目。 到目前为止,我发现这个问题的解决方法是使用Visual Assists扩展,因为它允许相对于目录或当前打开的文件添加新的文件。 看到这个post的进一步解释。

我迟到了,但我build议不要接受的答案。 代码可移植性的主要原因。 相反,我build议:

  1. 在Visual Studio之外创build文件夹和子文件夹的布局(与接受的答案相同,但接下来的点不同)。 在每个子文件夹内创build一个includesrc文件夹
  2. 然后在configuration属性> C / C ++>常规>“其他包含目录”(适用于所有configuration和所有平台)添加一个文件夹,这是所有子文件夹的基础。
  3. 添加你的src文件并在这些子文件夹中包含文件。

  4. 最后使用对于这个基础文件夹的path包含每个头文件。

要清楚:如果你的项目布局如下:

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

你应该在functions.cpp包含以下include语句:

 #include"Math/include/functions.h" 

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

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

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

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

ps:VS 2015的intellisensefunction有助于编写#include...

如果你想创build你的解决scheme,并在不同于你的源代码的位置项目,你可以改变你的工作目录:

Project > Properties > Configuration Properties > Debugging > Working Directory