首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多第三方依赖的大型跨平台C++项目磁盘上的物理布局

多第三方依赖的大型跨平台C++项目磁盘上的物理布局
EN

Stack Overflow用户
提问于 2013-10-27 10:22:50
回答 1查看 1.2K关注 0票数 7

我正在重新组织具有许多第三方依赖项的大型跨平台C++项目的物理(磁盘上)布局,该布局使用CMake构建。

由于我们需要支持Windows,这是一个没有完善的包管理器的平台,我们很久以前就决定在源代码树中包含我们所依赖的第三方库。然而,在我们支持的其他平台上,例如Linux和Mac,许多第三方库都可以作为包使用,或者已经存在于系统中,并且很容易被CMake找到。

目前的项目布局如下:

代码语言:javascript
运行
复制
root/
    src/
        3rd-party-lib1/       (build system modified to output to build/)
        3rd-party-lib2/       (build system modified to output to build/)
        project-module1/      (our own code)
        project-module2/      (our own code)
    build/                    (CMake is invoked from here)
        3rd-party-lib1-bin/
        3rd-party-lib2-bin/

对第三方库进行了调整,以便在构建时将它们的二进制文件输出到root/build/<lib>/

此布局的问题是多方面的:

  • 第三方库不再是100%的原始。这使得更新它们比需要的稍微困难一些。
  • src/ 目录包含了我们自己的代码和第三方代码的混合,这是令人困惑的。
  • src/ 目录是非常大的。因为src/包含第三方库,所以与原始源代码的实际数量相比非常大,使得备份我们自己的代码比需要的稍微复杂一些(我们不能再把整个src/目录存档了)。
  • 项目存储库(Git)是非常大的,因为包含了第三方库(它可能包含许多非源文件,如文档、测试数据等),而且每次更新它们时,都会变得更大。不幸的是,这里没有办法,除非我们决定用一个新的存储库重新启动(不幸的是,丢失了整个提交历史)。
  • 其中许多包括第三方库(例如zlib、libpng)对于在Linux或Mac上构建项目的用户根本不需要,尽管它们大大简化了Windows用户的工作。

另一种布局如下:

代码语言:javascript
运行
复制
root/
    3rdparty/
        3rd-party-lib1/       (100% original, contains built artifacts)
        3rd-party-lib2/       (100% original, contains built artifacts)
    src/
        project-module1/      (our own code)
        project-module2/      (our own code)
    build/                    (CMake is invoked from here)

我们的CMake文件需要进行修改,以便为每个库在正确的位置查找第三方头文件和库。

在本地跨平台项目中处理第三方库的最佳实践是什么?哪种布局将为我们的开发人员在各自的平台上带来最不令人惊讶的构建体验?现有项目成功布局的具体例子也值得欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-02 01:39:39

我的经验表明,以下是最佳做法:

  • 当第三方开源库完全按原样使用时,在主git中提交下载的压缩tarball的本地副本,以避免网络连接问题阻止软件构建。
  • 当第三方开源库几乎以原样使用,但需要调整(交叉编译时很常见:许多包需要对其配置步骤稍加调整)时,将压缩的tarball和“统一的diff”补丁文件存储在主git中,并在ExternalProject_Add的ExternalProject_Add步骤中应用补丁。
  • 当您的组织对第三方开源库进行了大量修改或扩展时,请使用单独的git存储库来保存指向上游存储库的指针(当它也使用git时最简单,但也可以管理上游svn )。将您的组织的更改提交到与用于向上游镜像的分支不同的分支。如果您愿意,您可以在主git和这个git之间引入一个子模块关系,但是由于DOWNLOAD_COMMAND可以直接从任意的git中获取,所以在技术上没有必要这样做。
  • 通过将小型的、不那么频繁的第三方专有二进制文件存档在主git中也是合理的。然而,第三方二进制文件可以用于各种平台,很大,或者经常演化,应该存储在它们自己的git中,并通过DOWNLOAD_COMMAND获取,如前所述。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19616984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档