在跨平台项目中,我使用了许多第三方库。我最终决定将它们的源代码包含到我的存储库中,而不需要在每个平台上再次下载它们。这是许可证允许的。
要包含这些库中的 header ,我需要指定它们的文件路径。一些库将它们放在 name/include/name/file.h
中,但通常每个库都有不同的目录结构。
我希望始终以 #include "name/file.h"
的形式在我的代码中包含 header ,其中 name 是库的名称。但我既不想修改库的目录结构,也不想将所有 header 复制到所需结构的包含目录中。
有没有办法定义诸如包含目录别名之类的东西?例如,Bullet Physics 的 header 位于 bullet/src
,Sqlite 的 header 直接位于 sqlite
和 < em>SFML 在 sfml/include/SFML
中有它们。我想指定这样的内容:
#alias "dependencies/bullet/src" "bullet"
#alias "dependencies/sqlite" "sqlite"
#alias "dependencies/sfml/include/SFML" "sfml"
因此 #include "sfml/System.hpp"
等同于
#include "dependencies/sfml/include/SFML/System.hpp"
.
该技术不必处于预处理器阶段。例如,它也可以是一个以正确方式生成项目的 CMake 标志。但是,我认为编译器必须以某种方式意识到这种技术,才能实现这一点。
最佳答案
没有;最近的方法是命令行上的 -I
选项的集合。
此外,如果您使用 SFML,推荐的符号是 #include "SFML/System.hpp"
;这就是您应该在代码中编写的内容。然后修复编译环境,使 -Idependencies/sfml/include
包含在编译中,或者使用符号链接(symbolic link)(如果它们足够便携)来创建子目录,如 SFML
在包含项目 header 的主目录中。
当安装像 SFML 这样的软件包时,头文件将被放置在一个目录中 — 默认情况下通常是 /usr/local/include
,通常在该目录下的子目录中。也就是说,将有一个包含 SFML header 的目录 /usr/local/include/SFML
。其他软件包的机会也是如此。您应该将这些 header 安装在构建区域下的某个位置,以便可以正常找到 header — 您只需指定在其下找到 header 的基本 include
目录。 (注意:当您安装 Bullet Physics library 时, header 被放置在目录 .../include/bullet
中,其下有各种子目录,因此它也遵循此约定。)
否则就意味着与系统作斗争,而当你与系统作斗争时,你最终会输。这比顺其自然更难。
关于c++ - 是否有像包含目录别名这样的概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21847265/