c++ - 是否有像包含目录别名这样的概念?

标签 c++ include cmake cross-platform project

在跨平台项目中,我使用了许多第三方库。我最终决定将它们的源代码包含到我的存储库中,而不需要在每个平台上再次下载它们。这是许可证允许的。

要包含这些库中的 header ,我需要指定它们的文件路径。一些库将它们放在 name/include/name/file.h 中,但通常每个库都有不同的目录结构。

我希望始终以 #include "name/file.h" 的形式在我的代码中包含 header ,其中 name 是库的名称。但我既不想修改库的目录结构,也不想将所有 header 复制到所需结构的包含目录中。

有没有办法定义诸如包含目录别名之类的东西?例如,Bullet Physics 的 header 位于 bullet/srcSqlite 的 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/

相关文章:

cmake - cmake中的“$ <$ <CONFIG:Debug>:Release>”是什么意思?

c++ - 如何运行所有子目录 CMakeList 文件并捕获输出?

c++ - 我们如何在子类中键入定义或重新定义模板化嵌套类?

c++ - 在 VTK 中绘制球体数组

c++ - 更多线程,更好的性能?

c++ - 为什么当我用 Rcpp 编写时我不需要包含一些我应该包含在纯 C++ 中编写的库?

使用 cmake 和 pybind11 构建示例应用程序时找不到 Python.h

c# - 字节流中的双值传输

java - 在 Java 中没有一个简单的 "include"方法吗?

css - 我的样式表中的图像