Visual c + + : # include 文件来自同一解决方案中的其他项目

我正在用 Visual C + + 开发一个游戏。我在单独的项目中有一些组件,并且已经设置了项目依赖项。如何 # 包含来自不同项目的头文件?我不知道如何在另一个项目中使用来自一个项目的类。

150952 次浏览

您需要在项目属性中设置头文件的路径,以便编译器在尝试查找头文件时查找那里。我记不清确切的位置了,但是看看这个项目的属性,你应该能看到它。

Settings for compiler

在希望 # include 头文件的项目中,需要将头文件的路径添加到项目配置中的 附加包含目录部分。

To access the project configuration:

  1. 右键单击该项目,并选择“属性”。
  2. 选择 Configuration Properties-> C/C + +-> General。
  3. 在“附加包含目录”下设置路径。

如何包括

对于 包含头文件,只需在代码中编写以下代码:

#include "filename.h"

请注意,这里不需要指定路径,因为您已经将该目录包含在“附加包含目录”中,因此 VisualStudio 将知道在哪里查找它。

如果您不想在项目设置中添加每个头文件位置,您可以只包含一个目录到一个点,然后 # include relto that point:

// In project settings
Additional Include Directories    ..\..\libroot


// In code
#include "lib1/lib1.h"    // path is relative to libroot
#include "lib2/lib2.h"    // path is relative to libroot

连接器设置

如果使用静态库(即。Lib 文件) ,您还需要将库添加到链接器输入,以便在链接时可以链接到这些符号(否则您将得到一个未解析的符号) :

  1. 右键单击该项目,并选择“属性”。
  2. 选择 Configuration Properties-> Linker-> Input
  3. Enter the library under Additional Dependencies.

#include与项目没有任何关系——它只是告诉预处理器“将头文件的内容放在这里”。如果你给它一个路径,指向正确的位置(可以是一个相对路径,如。./your _ file. h)它将被正确包含。

但是,您必须了解库(静态/动态库) ,以便使这些项目能够正确链接——但这是另一个问题。

尽量避免 # include 指令中的完整路径引用,无论它们是绝对引用还是相对引用。相反,请在项目设置中添加其他项目的 include 文件夹的位置。必要时仅在路径引用中使用子文件夹。这样,不用更新代码就可以更轻松地移动事物。

因为这两个项目都在同一个解决方案下,所以对于包含文件和链接器有一种更简单的方法,如 https://learn.microsoft.com/en-us/cpp/build/adding-references-in-visual-cpp-projects?view=vs-2019所述:

  1. 可以在相对路径中写入 include (例如 #include "../libProject/libHeader.h")。
  2. 对于链接器,右键单击“引用”,单击“添加引用”,然后选择其他项目。

在@Benav 的回答基础上,我更倾向于这样做:

  1. 将解决方案目录添加到包含路径:
    • right click on your project in the Solution Explorer
    • 选择属性
    • 从下拉列表中选择所有配置和所有平台
    • 选择 C/C + + > General
    • $(SolutionDir)添加到附加包含目录
  2. 添加对要使用的每个项目的引用:
    • right click on your project's References in the Solution Explorer
    • 选择 Add Reference..。
    • 选择你要参考的项目

现在,您可以像下面这样包含引用项目的头:

#include "OtherProject/Header.h"

备注:

  • 这假设您的解决方案文件存储在每个项目之上的一个文件夹中,该文件夹是使用 VisualStudio 创建项目时的默认组织。
  • 您现在可以从相对于解决方案文件夹的路径中包含 任何文件,这可能并不理想,但为了方法的简单性,我对此没有意见。
  • 步骤2对于 #include来说是不必要的,但是它设置了正确的构建依赖项,这可能是您想要的。