使用附加包含目录
包含来自其他目录的代码
引言
大多数程序员的常见目标之一是重用代码。为了重用代码,我们当前的项目必须能够将其包含在构建过程中。这个编程技巧提出了我发现的关于此选项的一个难题。
背景
在编写我的服务器和客户端 TCP/IP 应用程序时,我编写的服务器和客户端代码需要一些用于开发的测试项目。核心代码是一些将包含在其他项目中的类。我不想在每个使用它们的项目中都放一个新副本,所以它们需要放在一个特殊的目录中以便重用代码。在测试项目中访问它们的方法是通过属性。这有一个问题,因此有了这个编程技巧。
这是指向引发此需求的文章和项目的链接:我的 TCP/IP 文章。
使用技巧
有两种方法可以了解此技巧。首先,启动您自己的项目。在解决方案目录之外的某个位置创建一个目录,以存储要包含在多个解决方案/项目中的代码。
其次,从我刚刚引用的文章中下载解决方案。由于 VS(Visual Studio)用于引用附加包含的方式,您必须按照以下步骤才能获得良好的构建。
此时,我假设您已完成上述两种操作中的一种,并且具有
- 一个准备构建的解决方案和
- 一个单独的目录,其中包含准备合并到您的解决方案项目中的代码或类
这两个操作是相同的,因此我使用我引用的解决方案作为演示此方法的工具。
打开解决方案,右键单击一个项目,然后选择属性。在“属性页”对话框的“资源管理器”部分,选择 C/C++,如下图所示。注意:其他语言可能不同。

对话框的顶部是字段附加包含目录。该字段的主体包含我的包含目录D:\COMMON_CODE。用您公共代码目录的路径替换我的条目,然后单击“确定”。
如果您使用我的项目,请展开名为 Project_Client_
的项目以获取下图。如果您使用自己的解决方案和项目,您应该能够找到相似之处。

在“头文件”部分,有六个文件位于附加包含目录中。他们是
- C_Log_Writer.h
- C_TCP_Client.h
- C_TCP_Constants.h
- C_TCP_Format_WSA_Text.h
- C_TCP_IADS_Typedefs.h
- Gnu_Notice.h
源文件中的数量没有那么多,但是您可以弄清楚它们。
如果现在尝试构建,它将失败,因为编译器找不到这些包含文件及其关联的 dot CPP 文件。
为什么不! 我沮丧地喊道!它们完全在属性对话框中指定的位置。
该答案可以在文件 Project_Client.vcproj 中找到。(根据需要,更改您的文件名以匹配项目,但扩展名将相同。)编辑该文件并搜索文本:Additional 以找到类似的内容
AdditionalIncludeDirectories="D:\COMMON_CODE"
一切都很好。现在搜索其中一个包含文件,并找到类似于此的行
RelativePath="..\..\..\..\COMMON_CODE\C_Log_Writer.h"
每个来自包含目录的文件都有一个条目。这就是问题所在。当我们键入绝对路径时,VS 会记住它。当我们使用“添加”->“现有项”之类的东西添加文件时,VS 使用相对路径。在 VS 恳求我们输入绝对路径后,它生成了一个相对路径并忽略了我们的条目。这有点不友好。
要解决此问题,请关闭 dot vsproj 文件并返回到解决方案资源管理器。从解决方案中删除每个文件,然后将其重新添加。这将更新 dot vsproj 文件。别忘了,这个解决方案中有两个项目。
就是这样。祝你编码愉快。
历史
- 2013 年 5 月 4 日:原始帖子