gpt4 book ai didi

C++:包括目录,但只允许一个文件夹可见(对于 Eigen)

转载 作者:行者123 更新时间:2023-12-04 01:12:16 28 4
gpt4 key购买 nike

假设有人想将一个大型开源项目作为子模块包含在存储库 (myrepo) 中。对于此示例,我们以 Eigen 为例.没问题,我可以

git submodule add https://gitlab.com/libeigen/eigen.git

这会创建一个 eigen 子目录,其中包含很多子文件夹:

myrepo/
eigen/
bench
blas
ci
cmake
debug
demos
doc
Eigen
failtest
lapack
scripts
test
...

但是,为了使用 Eigen 库,真正需要的只是文件夹 myrepo/eigen/Eigen 的内容。所以我们只希望该文件夹对编译器/链接器可见。但是,为了清楚起见,我更希望包含该文件夹内的文件,例如 myrepo/eigen/Eigen/Dense ,如

#include <Eigen/Dense>

两个明显的次优解是

  1. 添加myrepo/eigen作为包含目录,包含如下文件

    #include <Eigen/Dense>
  2. 添加myrepo/eigen/Eigen作为包含目录,包含如下文件

    #include <Dense>

这两种方法都有明显的缺点。具体来说,

  1. 使用 myrepo/eigen 作为包含目录会将所有其他文件公开给编译器/链接器。由于 repo 的大小以及其中包含的所有其他文件,我觉得这是命名空间冲突或类似问题的定时炸弹。例如,现在编译器发现有一个 test/ 子文件夹,其内容现在是免费游戏。

  2. 我认为包含没有 Eigen 前导符的 header 对于代码清晰度来说是一场灾难。

    #include <Dense> // ¯\_(ツ)_/¯ Where did this come from??? 

我知道的唯一其他选择是 fork 或复制原始存储库并删除所有我想排除的内容。

我主要关心的是将 Eigen 添加为子模块。因此,如果有将其作为子模块包含在内的最佳实践建议,我也很感兴趣。我知道有一个与此主题相关的未解决问题:https://gitlab.com/libeigen/eigen/-/issues/1133

最佳答案

您可以创建一个单独的空目录include,并放置一个指向myrepo/eigen/Eigen 的软链接(soft link)Eigen。然后将 include 添加为搜索目录,而不是 myrepo/eigen

Git“按原样”跟踪软链接(soft link),将链接的路径存储在存储库中,并在克隆时重新创建链接。它不会尝试验证链接是否有效。只要:

  • 链接以同一存储库中文件/目录的相对路径形式给出
  • 存储库被克隆到一个能够保存软链接(soft link)的文件系统上

一切都会按预期进行。

关于C++:包括目录,但只允许一个文件夹可见(对于 Eigen),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64479982/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com