【问题标题】:Update Boost version of library dependent on Boost libraries without relinking在不重新链接的情况下更新依赖于 Boost 库的库的 Boost 版本
【发布时间】:2012-04-30 08:01:45
【问题描述】:

我已经构建了一个依赖于多个 Boost 库的库 (VC10)。 我想在多个应用程序中使用这个库,其中每个应用程序都依赖于不同的 Boost 版本,我希望能够在不为每个 Boost 版本构建库的情况下做到这一点。

我使用 BOOST_ALL_DYN_LINK 和 BOOST_ALL_NO_LIB 构建了我的库,但这两个库似乎都依赖于特定的 Boost 版本。

有人能解释一下我如何构建一个依赖于 Boost 的库,并且可以在不重新编译或重新链接库的情况下更新 Boost 版本吗?

【问题讨论】:

  • Check this thread 也许有帮助?
  • 使用 BOOST_ALL_DYN_LINK(即在运行时链接 DLL)不会有帮助,因为目标系统上可能有不同的 BOOST 版本。您应该考虑提供一个静态库,其中包含正确的 boost 库,这些库也静态链接到您的 lib 项目。
  • 为什么静态链接的 boost 版本会更好?例如,我使用带有版本 A 的 boost 中的库 Thread 并将其静态链接到我的库。然后应用程序使用版本 B 的 boost Thread 以及使用版本 A 的库。在我看来这可能会导致问题。
  • 如果您将 boost 线程库静态链接到您自己的 lib,则您的 lib 独立于用户端任何其他本地可用的 boost 线程版本 - 它已经拥有所需的所有代码。
  • 是否有特定原因必须使用多个版本的 boost?这可能不是您正在寻找的答案,但是调整您的代码以使用单个版本可能会为您省去很多麻烦

标签: c++ boost dll dynamic-linking


【解决方案1】:

“有人可以解释一下我如何构建一个依赖于 Boost 的库,这样就可以在不重新编译或重新链接库的情况下更新 Boost 版本?”

我认为这是不可能的。任何数量的小更改,例如向类添加新数据成员,都需要重新编译以在版本之间切换。只有在 boost 不改变版本之间的任何此类细节的情况下才有可能。

如果您无法遵循 @jamesj 坚持使用单一版本的建议,命名空间可能会有所帮助。我会采用每个 boost 版本并对其进行修改,以便将 boost_x_y_z 而不是将 boost_x_y_z 作为顶级命名空间,其中 x y z 给出版本号。所以下面的代码

namespace acc = boost::accumulators;
typedef acc::features<acc::tag::density> features_t;
typedef acc::accumulator_set<double, features_t> accumulator_t;

可以针对版本 1.47.0:

namespace acc = boost_1_47_0::accumulators;
typedef acc::features<acc::tag::density> features_t;
typedef acc::accumulator_set<double, features_t> accumulator_t;

如果你不在乎你使用什么版本,你可以在某个地方放一个标题:

namespace boost_latest = boost_1_50_0;

所以我的例子会变成:

namespace acc = boost_latest::accumulators;
typedef acc::features<acc::tag::density> features_t;
typedef acc::accumulator_set<double, features_t> accumulator_t;

然后,当新版本出现时,您只需更新一个定义并重新编译。您的库的新版本仍应与旧程序的 ABI 兼容。但他们不会在不重新编译的情况下利用新的 boost 版本。

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多