最常见的C++关于第三方库的项目目录结构约定
Most common C++ project directory structure convention with respect to third-party libraries
我对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 是一种选择(即您不会在构建中同时使用两者)
或多或少的标准解决方案如下:
- 在主源代码管理存储库中,仅存储源文件和编译它们所需的生成系统文件。完全没有二进制依赖项。 如果依赖项对于
- 获取和安装非常重要,请创建一个辅助存储库并将依赖项放在其中。
- 如果您需要使用经过一些修改的外部库,而上游不接受它们,请将其完整的修改源代码树放入主源代码管理中,并将其构建过程集成到应用程序的构建过程中(树内分支),或者将修改后的源代码存储在另一个存储库中(树外分支)。请注意,如果您使用树内分叉,大多数许可证将要求您将程序开源。对于其他人,例如 LGPL,您可以只发布树外分叉的源代码。
例如,Inkscape项目就是这样做的:https://launchpad.net/inkscape 有一个主存储库,其中包含项目的完整源代码,https://launchpad.net/inkscape-devlibs 有一个单独的存储库,其中包含在Windows下构建所需的依赖项的二进制文件。
这样,您将避免因依赖项更改而使修订历史记录混乱,并在主树中存储大型二进制文件。
相关文章:
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 用于对项目进行分组并将单个项目映射到其他组成员的数据结构
- 如何使用矢量元素将项目添加到结构中?
- 在OSx:ld上使用CMake构建C++项目:找不到体系结构x86_64的符号
- 项目的生成文件,代码位于多个目录中,但目录结构相同
- CMake 项目结构:如何正确地将库合并在一起并将它们包含在多个可执行文件中
- 正确设置 BGFX(和项目结构)
- 无法生成项目,出现错误 - 未定义的体系结构符号 x86_64:"_JNI_CreateJavaVM"
- C :多文件C 项目中的相互引用的结构
- 与公开暴露的标头有关的C 项目结构
- Windows MSG 结构与旧项目代码结构 MSG 冲突
- 在类中使用结构时,我不断收到错误 C2797,并且它只发生在特定项目中
- 单源项目结构的缺点是什么?
- C 使用字符串项目在列表中查找结构
- 多平台C++项目结构
- Qt项目结构
- 在Visual Studio 15社区中构建Lua的解决方案/项目结构
- Visual Studio 2010 C++项目结构
- c++ makefile构建多个dll和项目结构
- CMake:具有单元测试的项目结构