【发布时间】:2008-12-04 09:09:22
【问题描述】:
我必须包含许多头文件,它们位于不同的子目录中。在 Visual Studio(我使用的是 2005 版)中有没有办法设置一个包含路径,Visual Studio 也会在子目录中搜索头文件?
【问题讨论】:
标签: c++ visual-studio visual-studio-2005 include
我必须包含许多头文件,它们位于不同的子目录中。在 Visual Studio(我使用的是 2005 版)中有没有办法设置一个包含路径,Visual Studio 也会在子目录中搜索头文件?
【问题讨论】:
标签: c++ visual-studio visual-studio-2005 include
从设计的角度来看,在 Visual Studio 设置中设置文件夹搜索路径来修复包含问题通常并不是一个好主意。您的代码对于具有不同目录布局的不同机器的可移植性会降低。
我的建议是确定您的代码组织,以便固定子目录的相对路径(相对于您的包含代码):
#include "subdirectory/somefile.h"。这还有一个额外的好处,就是能够查看您的解决方案中的哪个文件夹包含该文件 - 当您试图找到自己的方式或试图找出文件的用途时,这通常是有用的信息。
【讨论】:
我们还没有找到在 Visual Studio 中设置递归文件夹搜索的方法(尽管 Xcode 设置和使用它们没有问题)。我们所做的是列出一个文件中的所有目录,并在 C/C++ 命令行附加选项中指定该文件:
@"IncludeFolders.rsp"
我们很少发现使用递归搜索的问题,尽管意外包含 ``/'' 确实让事情变慢了一点。
【讨论】:
我发现在大多数情况下,包括在 MSVC 中,我都可以通过使用 SUBST 命令的一些技巧来缩短路径长度。我将展示缩短默认继承的 C++ 包含路径的示例,但您可以为与项目相关的包含路径执行此操作。 首先创建一个或多个这样的批处理文件(并从 Windows 资源管理器或命令行运行它们):
MDrive.bat:
subst M: /D
subst M: "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC"
WDrive.bat:
subst W: /D
subst W: "C:\Program Files (x86)\Windows Kits\8.1\Include"
... This is just and example. You would do this for your
project related include directories.
您可以为较长的路径创建多个此类。在上述情况下,我只是缩短了 MSVC 默认使用的标准继承路径。顺便说一句,Subst 命令在没有管理权限的情况下工作,但不要踩到现有的物理或映射驱动器号(我不确定会发生什么——我现在不想测试它)。
此步骤是可选的。我在 MSVS 2010+ 中添加了一个自定义属性表。 顺便说一句,如果您不了解自定义属性表,您应该了解。 请参阅 Property Pages (Visual C++)。 VIEW-Other Windows-Property Window,在Property manager中右击项目,Add a New Project Properties Sheet。在用户宏下,添加一个宏,例如MyProjectIncludePaths 并将值(在本例中)设置为
M:; M:\atlmfc\include; W:\um; W:\shared; W:\winrt
--本例中只有49个字符,比默认的
短很多$(VC_IncludePath); $(WindowsSKD_IncludePath)
在宏扩展时转换为
C:\Program Files (x86)\Windows Kits\8.1\Include;C:\Program Files (x86)\Windows Kits\8.1\Include\atlmfc\include;C:\Program Files (x86)\Windows Kits\8.1\Include\um;C:\Program Files (x86)\Windows Kits\8.1\Include\shared;C:\Program Files (x86)\Windows Kits\8.1\Include\winrt
根据我的统计,默认值为 270 个字符——即超过 260 个字符——谁能解释一下?
在 project 的属性页中(即不是自定义属性表),在我的示例中,我转到 Configuration Properties-VC++ 目录 并更改了 在 $(MyProjectIncludePaths) 中包含目录 值,但实际上您会转到(如果您创建了一个自定义属性表页面,则在您的自定义属性表页面中)C/C++-General em> 并将 $(MyProjectIncludePaths) 添加到 Additional Include Directories。
除了继承的 270 个字符路径之外,我还能够在 Additional Include Directories 下添加一些合理长度的路径。也许附加包含目录有自己的长度限制(?)。
【讨论】:
我相信使用递归搜索包含文件会导致比它以错误文件或包含错误版本的形式解决的问题多得多。毕竟,您必须在设置项目时定义一次正确的目录。
【讨论】:
在包含路径中使用这个来包含所有子目录
${workspaceFolder}
${workspaceFolder}/**
【讨论】: