VC2010 C++ - 组织源文件

Meg*_*ron 65 visual-studio-2010 visual-studio

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

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

在此先感谢您的帮助

lib*_*rik 154

你对Visual Studio如何使用C++文件感到有些困惑,但这没关系,因为文档很糟糕.首先要做的事情是:与C#或Java不同,项目中文件的排列与磁盘上文件的排列无关.文件和文件夹不在项目中,真的; 该项目仅列出必须已存在于磁盘上的文件和文件夹的名称和路径.

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

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

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

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

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

  • SuperCalc\Build

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

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

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

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

右键单击"SuperCalc"项目的Source Files过滤器,然后选择Add> Add New Filter.给它起名称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目录),并且您在源子目录中添加.cpp文件,你可以去看看使用记事本SuperCalc.vcxproj文件里面,你会看到这样几行:

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

由于没有绝对路径,您可以使用整个SuperCalc目录树并将其移动到其他位置,它仍然可以工作.不需要像$(CURDIR)这样的环境变量黑客.

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

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

完成此更改后,Source\Math\Matrix\matrix_multiply.cpp等文件可以有一行

#include "input_configuration.hpp"
Run Code Online (Sandbox Code Playgroud)

#include一个来自Input目录的文件,它将All All Work.

(如果它不是All Just Work,通常的方法是返回Project Properties并调整..\附加包含目录前面的序列数. 请记住,每次进行更改时都必须选择All Configurations再次 - 否则您的更改将仅适用于当前配置(调试或发布).该设置不粘.)

  • 很好的答案。我创建了与我的目录结构相匹配的过滤器,但我遇到了反复出现的头痛,您对此略有提及。VS 不知道我的过滤器链接到目录。当我按顺序添加代码时,这变得很痛苦:foo.h、foo.c、bar.h、bar.c。我必须记住不断将目录更改到正确的位置。VC++ 会记住你的最后一个目录,所以它总是落后一步。我向 MS 发布了一个建议,允许将目录与过滤器相关联。是这里。如果这也让您感到困扰,请支持该建议。http://tinyurl.com/bud4zsv (2认同)

mor*_*des 23

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

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