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

Most common C++ project directory structure convention with respect to third-party libraries

本文关键字:项目 结构 约定 第三方 常见 C++      更新时间:2023-10-16

我对C++有点陌生(学习一些游戏编程知识),我想使用通用约定设置我的目录结构。我的主要困惑点,我没有看到明确的建议,是我在哪里放置依赖项。例如,我将研究FreeGLUT和FreeType。我下载的第一件事是FreeGLUT的MSVC版本,它带有一个子目录结构,如下所示:

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

我的 C# 开发人员想要在我的解决方案目录中创建一个名为"依赖项"的子目录,获取所有这些并将其放在其自己的子目录中,然后对任何其他库执行相同的操作,类似于 NuGet 包目录,然后在生成时引用适当的位置。我不是 100% 确定,但我猜如果头文件分散在不同的子目录中,这可能会在引用头文件方面很混乱,因为您不只是像在 C# 中那样在C++中"添加引用"。

我的依赖项应该成为项目的一部分吗?我应该将它们分解到不同的基本文件夹中吗?标准做法是什么?

:注:我知道 lib 或 dll 是一种选择(即您不会在构建中同时使用两者)

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

  1. 在主源代码管理存储库中,仅存储源文件和编译它们所需的生成系统文件。完全没有二进制依赖项。
  2. 如果依赖项对于
  3. 获取和安装非常重要,请创建一个辅助存储库并将依赖项放在其中。
  4. 如果您需要使用经过一些修改的外部库,而上游不接受它们,请将其完整的修改源代码树放入主源代码管理中,并将其构建过程集成到应用程序的构建过程中(树内分支),或者将修改后的源代码存储在另一个存储库中(树外分支)。请注意,如果您使用树内分叉,大多数许可证将要求您将程序开源。对于其他人,例如 LGPL,您可以只发布树外分叉的源代码。

例如,Inkscape项目就是这样做的:https://launchpad.net/inkscape 有一个主存储库,其中包含项目的完整源代码,https://launchpad.net/inkscape-devlibs 有一个单独的存储库,其中包含在Windows下构建所需的依赖项的二进制文件。

这样,您将避免因依赖项更改而使修订历史记录混乱,并在主树中存储大型二进制文件。