2

我想开发一个可以在许多不同平台上构建的项目。项目代码将使用 C++,管理库的最佳方式是什么?

我计划使用 bjam 作为构建系统,因为我也将依赖 Boost 及其单元测试框架。

这两个依赖项是 Boost 本身和 FLTK。

图书馆管理想到的可能性是:

  1. 在树中包含所有受支持平台的构建工件(二进制文件)和标头
  2. 在树中包含所有库依赖项的完整源代码,并以某种方式将它们编写为依赖项
  3. 1 和 2 的组合,就像 node.js 与 v8 一样
  4. 通知用户他们需要自己构建库,然后将它们放在 PATH 或某个特殊目录中,就像 libcurl 对其依赖项所做的那样
  5. 依赖 *nix 构建工具(即 libtool)mozilla 风格,然后告诉用户他们必须使用 MSYS 在 windows 上构建

这里最好的方法是什么?在接下来的六个月里,这个项目可能不会超过几千行,但我想在这里做出正确的选择,这样我以后就不必再回来换所有的东西了。

4

1 回答 1

1

这是一个主观的答案。

首先,关于 Boost:一旦构建了 Boost,无论以何种方式,您都不需要使用 bjam。因此,您可以使用任何适合您的构建系统,同时要求某些库位于系统上或某些路径中,无论它们是如何构建的。附带说明一下,boost 的大部分内容都是仅标头(即使是单元测试框架也可以使用仅标头 IIRC,但建议使用库版本)。假设您需要 boost 二进制文件。

处理项目 IMO 的最佳方法是使用您自己选择的最适合您自己项目的构建系统,并要求“预构建”依赖项(增强)。它们的预构建方式取决于每个依赖项;有些人可能使用您选择的相同构建系统,其他人将使用他们自己的构建系统。有些将适用于所有平台,例如,有些将在 windows 上编译,但没有适合 windows 的最佳构建系统。如果它们是小型库,您可以将它们集成到您的构建系统中,否则只需将它们视为开发人员在构建项目之前“以某种方式”必须拥有的“依赖项”。这里的“不知何故”将在自述文件中进行解释。

例如,我在我的项目中使用 cmake,但在我的项目中使用 boost 和其他一些库。cmake 允许我为 MSVC、C::B、GNUMake 等生成项目文件,但是我不能希望我的所有依赖项也使用 cmake。对于非常小的、稳定的库,我可以为它们制作一个 cmake 项目,然后事情就变得非常简单。对于更大或更易变的库,最好将每个库留给自己的构建系统。易失性库经常更改,因此如果您为它们构建任何“自定义”内容,您将不得不不断调整您的“自定义”以适应库中的更改。对于我使用的每个库,我都有一些 cmake 变量,例如 BOOST_LIB_INCLUDE_PATHS 和 BOOST_LIB_LIBRARY_PATHS 和 BOOST_LIB_LIBRARIES,可以由编译我的项目的开发人员将其定义为它们的值。

您可以自行决定是否向这些库提供源代码;这没什么错,尤其是在您想要依赖特定版本的库的情况下。但是除了对易失性库的维护之外,将它们编写为依赖项可能会变得一团糟。

但是,我知道当 Google Chromium 项目构建时,会下载、签出、构建和链接大约一百个库。Chromium 使用 GYP 作为构建系统 IIRC。

于 2012-09-19T01:46:37.020 回答