关于第三方库,最常见的C ++项目目录结构约定

时间:2015-01-12 23:41:11

标签: c++

我是C ++的新手(学习一些游戏编程的东西),我想使用常见的约定来设置我的目录结构。我的主要困惑点,我还没有看到明确的推荐,是我放置依赖关系的地方。例如,我将会关注FreeGLUT和FreeType。我下载的第一件事是FreeGLUT的MSVC版本,它带有如下的子目录结构:

bin/
    freeglut.dll
    x64/
        freeglut.dll
include/
    GL/
        someheaders.h ...
lib/
    freeglut.lib
    x64/
        freeglut.lib
readme.txt

我的C#开发人员希望创建一个名为" Dependencies"的子目录。在我的解决方案目录中,取出所有这些并将其放在它自己的子目录中,然后对任何其他库执行相同的操作,类似于NuGet包目录,然后在构建时引用相应的位置。我不是百分百肯定,但我猜这可能会引起头文件的混乱,如果它们分散在不同的子目录中,因为你不仅仅是"添加参考文献"在C ++中,就像在C#中一样。

我的依赖项应该是我项目的一部分吗?我应该将它们分成不同的基本文件夹吗?标准的事情是什么?

n.b。我知道lib或dll是一个选择(即你不能在你的构建中使用它们)

1 个答案:

答案 0 :(得分:2)

或多或少的标准解决方案如下:

  1. 在主源代码控制存储库中,只存储编译它们所需的源文件和构建系统文件。完全没有二进制依赖。
  2. 如果依赖项对于获取和安装而言非常重要,请创建一个辅助存储库并将依赖项放在那里。
  3. 如果您需要使用带有一些修改的外部库并且上游不接受它们,请将其完整修改后的源代码树放入您的主源代码控制中,并将其构建过程集成到您的应用程序的构建过程中(在-tree fork),或将修改后的源存储在另一个存储库(out-of-tree fork)中。请注意,如果使用树内分支,大多数许可证都要求您使程序成为开源代码。与其他人,例如LGPL,您只需发布树外分叉的源代码即可。
  4. 这就是例如Inkscape项目:https://launchpad.net/inkscape上有一个主存储库,包含项目的完整源代码,https://launchpad.net/inkscape-devlibs上有一个单独的存储库,其中包含在Windows下构建所需的依赖项的二进制文件。 / p>

    通过这种方式,您可以避免使用依赖项更改来混乱修订历史记录,并在主树中存储大型二进制文件。