【问题标题】:VC2010 C++ - organizing source filesVC2010 C++ - 组织源文件
【发布时间】:2011-03-16 05:26:44
【问题描述】:

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

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

提前感谢您的帮助

【问题讨论】:

    标签: visual-studio visual-studio-2010


    【解决方案1】:

    您对 Visual 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 & SuperCalc.vcxproj.filters)。在 Visual Studio 中执行此操作。通常项目文件位于解决方案目录的子文件夹中;这将由 Visual Studio 自动为您完成。选择一个位置 解决方案文件——它应该与源代码位于同一目录结构(文件夹树)中。我建议把它放在 Source 目录旁边,在:

    • SuperCalc\Build

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

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

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

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

    右键单击“SuperCalc”项目的源文件过滤器,然后选择添加 > 添加新过滤器。将其命名为Input(SuperCalc\Source 目录中的第一个)。同时创建过滤器MathOutput。右键单击 Math 过滤器并选择添加 > 添加新过滤器,以创建一个名为 Matrix 的子过滤器(在数学内部)。现在你有了这些过滤器

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

    它与您之前创建的目录(文件夹)平行。 这纯粹是人类方便的安排。 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.vcxprojSuperCalc\Build 目录),并且在源子目录中添加了 .cpp 文件,您可以使用记事本查看 SuperCalc.vcxproj 文件,然后您会看到这样的行:

    由于没有绝对路径,您可以获取整个 SuperCalc 目录树并将其移动到其他地方,它仍然可以工作。不需要像 $(CURDIR) 这样的环境变量 hack。

    最后要知道的一件事:由于您将源文件放在多个目录中,您可能会遇到#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 输入目录中的一个文件,它将全部正常工作。

    (如果它不能正常工作,通常的方法是返回项目属性并在附加包含目录前面摆弄..\ 序列的数量。记住每次进行更改时,您必须再次选择所有配置 - 否则您的更改将仅适用于当前配置(调试或发布)。该设置不具有粘性.)

    【讨论】:

    • 另外,您可以定义用户宏,例如。 $(source) 通过属性表 (.props)。我建议在属性表中进行尽可能多的项目设置,因为许多项目可能共享设置。
    • 不错的答案。我创建了与我的目录结构相匹配的过滤器,但我遇到了一个反复出现的头痛,你稍微提到了这个问题。 VS 不知道我的过滤器链接到目录。当我按顺序添加代码时,这变得很痛苦:foo.h、foo.c、bar.h、bar.c。我必须记住不断将目录更改到正确的位置。 VC++ 会记住你的最后一个目录,所以它总是落后一步。我向 MS 发布了一个建议,允许将目录与过滤器相关联。是这里。如果这也让您感到困扰,请支持该建议。 tinyurl.com/bud4zsv
    • 甜蜜! 2015社区,新建>项目...>其他项目类型>visual studio解决方案>空白解决方案下有一个空解决方案
    【解决方案2】:

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

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

    【讨论】:

    • 你成就了我的一天!非常感谢!我只有一个问题:为什么它不是默认设置为空项目? @thomthom “我一直在寻找这样的解决方案已经好几个小时了!” - 我也是)
    【解决方案3】:

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

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

    4. 最后使用 relatives 路径将每个头文件包含到此基本文件夹。

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

    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) 中重新使用您的 Math 子文件夹,而不会感到痛苦:只需将 MyProject 基本文件夹添加到项目 B 的“其他包含目录”中即可。

    关键是只有一个基本文件夹进入“附加 包括目录”属性。

    ps:VS 2015 的智能感知功能对编写#include...有很大帮助

    【讨论】:

    • 这很脆弱。最好将搜索目录提供给编译器,而不是将代码头路径输入源文件。
    • 我刚刚查看了谷歌的skia库,他们在包含语句中使用了完整路径,使用了相当深的子文件夹。我宁愿看到#include "superlib/defines.h" 而不是#include "defines.h" // I don't know where this came from
    【解决方案4】:

    使用诸如CMakePremake 之类的构建系统有助于组织文件,并且它还有一个额外的好处是可以帮助您将代码移植到其他平台。 Here 是一个很好的主题介绍。

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

    【讨论】:

      【解决方案5】:

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

      Project > Properties > Configuration Properties > Debugging > Working Directory

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        相关资源
        最近更新 更多