Visual C++:在同一解决方案中包含其他项目的#include文件

127

我正在使用Visual C++开发游戏。我将一些组件放在不同的项目中,并设置了项目依赖关系。如何#include来自另一个项目的头文件?我不知道如何在其他项目中使用一个项目中的类。

6个回答

224

编译器设置

在想要从另一个项目中#include头文件的项目中,您需要将头文件的路径添加到项目配置的附加包含目录部分。

访问项目配置的方法如下:

  1. 右键单击项目,选择属性。
  2. 选择配置属性 -> C/C++ -> 常规。
  3. 在附加包含目录下设置路径。

如何包含

包含头文件,只需在代码中写入以下内容:

#include "filename.h"

请注意,在这里您不需要指定路径,因为您已经在“附加包含目录”中包含了目录,所以Visual Studio会知道在哪里查找它。
如果您不想在项目设置中添加每个头文件的位置,您可以只包含到某个点的目录,然后相对于该点进行#include。
// 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. 选择另一个项目,然后点击确定。

现在构建您的项目将会在必要时触发构建另一个项目,并且链接器将能够解析外部符号。


12
我可以说,在 Stack Overflow 上读了一上午的关于这个主题的答案后,你的回答是我遇到的最清晰和全面的。干得好,谢谢! - David Hall
12
有一个匿名用户的建议是:“当您包含库的路径时,如果路径中有空格,请确保将它们用引号括起来。” 如果这个建议对任何人有帮助,可以将其添加为注释。 - iDev
4
我想指出,使用“附加包含目录”与其他项目的源文件目录可能是一个糟糕的主意。其他项目可能具有相同名称的文件(如果您为每个项目使用预编译头文件,则非常可能)。就个人而言,我更喜欢添加项目源文件的父文件夹,这样你至少可以自行指定,例如 #include "proj2\include.h"。 对于每个解决方案有多个项目似乎很适合.NET语言,因为它们的使用方式非常不同。但是对于C ++项目,尚未找到一个好的方法来克服这个问题。 - Deji
3
我无法理解的是,如果链接器没有.lib.dll,你如何告诉链接器定义在哪里(另一个项目的.cpp)?现在我有一个链接器错误,因为我不知道在“附加库”中放什么,所以链接器找不到定义。 - Steinfeld
24
这有点粗糙。Visual Studio可以自动完成很多工作。很难相信除了硬编码路径之外没有更好的解决方案 - 可以考虑项目依赖设置或类似的方法。 - Cookie
显示剩余6条评论

11
由于这两个项目都在同一个解决方案下,可以采用更简单的方式来处理包含文件和链接器,具体步骤请参考learn.microsoft.com
  1. 包含文件可以使用相对路径的方式进行编写(例如:#include "../libProject/libHeader.h")。
  2. 对于链接器,右键点击“引用”,选择“添加引用”,然后选择另一个项目。

简单明了,但遗憾的是在包含头文件时需要使用相对路径。 - yoyo
在我看来,这是最好的答案。如果您将“../libProject”添加到包含路径中,则相对路径可能会更简单:(VS2015)属性/“C/C++”/附加包含路径。 - Chris Crozz
这个答案应该被采纳。 - Masoud Rahimi

11

在@Benav的回答的基础上,我的首选方法是:

  1. 将解决方案目录添加到您的包含路径中:
    • 在“解决方案资源管理器”中右键单击您的项目
    • 选择“属性”
    • 从下拉框中选择“All Configurations”和“All Platforms”
    • 选择“C/C++ > General”
    • $(SolutionDir)添加到“附加包含目录”中
  2. 为您想要使用的每个项目添加引用:
    • 在“解决方案资源管理器”中右键单击您项目的“引用”
    • 选择“添加引用…”
    • 选择您要引用的项目

现在您可以像这样引用来自已引用项目的头文件:

#include "OtherProject/Header.h"

注意事项:

  • 假设你的解决方案文件存储在每个项目的上一级文件夹中,这是使用Visual Studio创建项目时的默认组织方式。
  • 现在,你可以包含相对于解决方案文件夹的任何文件,但这可能并不理想,但出于简单的方法,我还是可以接受这种方式。
  • 对于#include,步骤2不是必需的,但它设置了正确的构建依赖关系,你可能需要这样做。

1
这也是适用于中型到大型代码库的最佳答案,因为最终你会遇到头文件名冲突或没有明显来源的头文件:#include "Retry.h"这也是 Google 的做法。我花了一段时间才认同这种思路,但现在我已经使用了几年,很难回去了。例如,请参阅 Google C++ 风格指南下的包含文件名称和顺序。 - Jim Beveridge

4

#include与项目无关,它只是告诉预处理器“在这里放置头文件的内容”。如果您提供指向正确位置的路径(可以是相对路径,例如../your_file.h),它将被正确包含。

但是,为了使此类项目正确链接,您需要学习有关库(静态/动态库)的知识 - 但这是另一个问题。


2

您需要在项目属性中设置头文件的路径,这样编译器在尝试查找头文件时就会查找那里。我记不清确切的位置了,但请浏览项目属性,您应该可以找到它。


位置可以在属性>C/C++>常规>附加包含目录下。 - Mustafa Kemal

1

尽量避免在#include指令中使用完整路径引用,无论是绝对路径还是相对路径。相反,将其他项目的包含文件夹位置添加到您的项目设置中。仅在必要时使用路径引用中的子文件夹。这样,移动文件时就不必更新代码,更加方便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接