【发布时间】:2019-11-05 02:12:42
【问题描述】:
在一个跨平台项目中,我使用了许多第三方库。我最终决定将它们的源代码包含到我的存储库中,而不需要在每个平台上再次下载它们。这是许可证允许的。
要包含这些库的标头,我需要指定它们的文件路径。有些库在name/include/name/file.h 中有它们,但通常每个库都有不同的目录结构。
我想在我的代码中始终以 #include "name/file.h" 的形式包含标题,其中 name 是库的名称。但我既不想修改库的目录结构,也不想将所有头文件复制到所需结构的包含目录中。
有没有办法定义诸如包含目录别名之类的东西?例如,Bullet Physics 的标题位于 bullet/src 中,Sqlite 的标题直接位于 sqlite 中,SFML 的标题位于 @987654325 中@。我想指定如下内容:
#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选项吗? -
否;最接近的方法是命令行上的
-I选项集合。此外,如果您使用 SFML,他们推荐的符号是#include "SFML/System.hpp";这就是您应该在代码中编写的内容。然后你修复编译环境,以便-Idependencies/sfml/include包含在编译中,或者你使用符号链接(如果它们足够便携的话)在包含项目头文件的主目录中创建像SFML这样的子目录。跨度> -
-I标志不允许我提供别名。这会向包含空间发送垃圾邮件,并使从单个给定库中查找标头变得不必要地困难。 -
没有
-I选项将使bullet/src/hdr.h可作为bullet/hdr.h访问 -
创建一个依赖目录,其中包含指向第 3 方库的各种包含目录的软链接。
标签: c++ include cmake cross-platform project