您对 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 个子目录:Input、Output 和 Math。 Math 子目录有一个名为Matrix 的子目录。您将在输入、数学、矩阵和输出中拥有 .cpp 文件。您将使用 Windows 资源管理器或命令提示符创建这些目录(文件夹)。
现在您还需要创建一个解决方案文件 (SuperCalc.sln) 和一个项目文件 (SuperCalc.vcxproj & SuperCalc.vcxproj.filters)。在 Visual Studio 中执行此操作。通常项目文件位于解决方案目录的子文件夹中;这将由 Visual Studio 自动为您完成。选择一个位置
解决方案文件——它应该与源代码位于同一目录结构(文件夹树)中。我建议把它放在 Source 目录旁边,在:
进入 VS 并选择 File > New > Project > Visual Studio Solutions > Blank Solution File。为解决方案命名(可能是“SuperCalc”)和位置(我们刚刚在SuperCalc\Build 目录中选择的位置)。它将为您创建解决方案文件。
现在右键单击解决方案资源管理器中的解决方案(“Solution SuperCalc,0 个项目”),然后选择 Add > New Project。选择一个名称——这将是您的程序可执行文件的名称,例如“SuperCalc”!选择Win32,Win32 Console Application(这是一个DOS控制台程序)或Win32 Project(这是一个普通的Windows GUI程序)。通常我然后单击应用程序设置进行一些重要的更改:一方面,我选择空项目,因为我不希望 Visual Studio 为我创建文件和代码,除非我告诉它。当一切都按照我想要的方式进行设置后,我点击 FINISH。
现在您已经获得了由 Visual Studio 创建的解决方案文件和项目。您还拥有在 Visual Studio 之外创建的源代码,或者至少是源代码所在的目录结构(文件夹树)。是时候将这两件事联系在一起了。
如果您愿意,您可以将所有源文件列出到项目的源文件过滤器中。即使它们来自不同的目录(输入、矩阵等),磁盘上文件的位置与它们在项目中的外观之间也没有必要的关系。但是如果你有很多文件,创建“子过滤器”会更容易,在 Source Files 过滤器中进行过滤,并为它们提供 Source 的子文件夹的名称。这样,您就可以在项目文件中复制磁盘目录的结构。
右键单击“SuperCalc”项目的源文件过滤器,然后选择添加 > 添加新过滤器。将其命名为Input(SuperCalc\Source 目录中的第一个)。同时创建过滤器Math 和Output。右键单击 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.sln 和 SuperCalc.vcxproj(SuperCalc\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 输入目录中的一个文件,它将全部正常工作。
(如果它不能正常工作,通常的方法是返回项目属性并在附加包含目录前面摆弄..\ 序列的数量。记住每次进行更改时,您必须再次选择所有配置 - 否则您的更改将仅适用于当前配置(调试或发布)。该设置不具有粘性.)