【问题标题】:Compiling with individual Boost libraries, Without installing Boost使用单个 Boost 库进行编译,无需安装 Boost
【发布时间】:2012-07-20 18:28:19
【问题描述】:

我正在实现一些我希望尽可能可移植的 C++ 代码。我想避免依赖于需要 root 访问权限才能安装的库。此外,我更愿意避免在我的存储库中保留大型库的副本,并且我也不想对库进行用户级安装(仅仅是因为我必须在多台计算机上手动安装它们。)

我想在我的项目中使用来自 Boost 的 normal_distribution 功能。我知道安装 Boost 的典型方法需要 sudo apt-getsudo yum 类型的命令,但我在运行此代码的系统上没有 root 访问权限。为了解决这个问题,我想知道是否可以简单地将 Boost 的 normal_distribution.cppnormal_distribution.hpp 的副本放在我的代码目录中,然后用这些文件编译/链接我的代码。这行得通吗?

读者可能想知道为什么我不只是在 TR1 或 C++11 中使用normal_distribution 实现。答案是我需要保持与仍然运行 g++ 4.1.x 的一些大学管理的集群的兼容性,这些集群(至少根据我的经验)不支持<TR1/random>

【问题讨论】:

  • 旁注:我正在从事的项目根本不是为了盈利,也不会违反任何 Boost 的许可条款。
  • boost 有一个实用程序可以提取任何标头的依赖项。不是完全100%,但是人工工作大大减少了。看看吧。
  • 谢谢,阿尔夫。我查看了使用 BCP (boost.org/doc/libs/1_50_0/tools/bcp/doc/html/index.html) 来提取依赖项——我可能仍然使用它。虽然不确定 BCP 的学习曲线是什么样的,但在尝试 BCP 之前,我可能会看看是否有更容易的事情发生。
  • 安装库需要root权限吗?
  • 你不需要 root 访问权限,就像大多数库一样,你可以在任何你喜欢的地方安装 boost,然后简单地告诉你的编译器和链接器如何找到它。

标签: c++ boost c++11 installation portability


【解决方案1】:

我想BCP (Boost Copy) 正是根据您的情况编写的。

【讨论】:

  • 好的,我正在尝试设置 BCP。我在 Mac OS X 机器上做了一个brew install boost。我读过 BCP 是 Boost 安装的一部分。然而。当我在命令行上输入bcp 时,我得到-bash: bcp: command not found
  • 我也做了brew install boost-build,但我仍然没有 bcp。当我 google bcp 时,大多数地方都说 bcp 是 boost 发行版的一部分。救命!
  • 我安装了 bcp。我不得不从 Boost 网站上提取源代码并构建/安装它。没有我想象的那么乏味。 :)
【解决方案2】:

您应该查看ryppl 项目,因为这正是它希望实现的目标。如果你点击 github 的链接,你会发现模块化的 boost,你可以从那里继续尝试完整的 ryppl 安装。无论如何,有一个中途的房子,那就是modularised boost。还有一个模块化的 boost/cmake 使其更简单。这是 ryppl 寻求提升的方向,它应该非常有帮助。我能看到的唯一缺点是零安装安装程序倾向于使用 python 脚本。

如上所述,BCP 也是为此目的而开发的,因此有选择。请注意,尽管 boost 正在经历 svn->git 更改,这似乎正在影响某些结构,这反映在与当前模块化 boost 的一些不一致之处,但我不确定这如何/是否会影响 BCP,因为我对此一无所知系统。

【讨论】:

  • 有趣。我可能会拉出当前的模块化 boost / ryppl 并安装它。 :)
【解决方案3】:

我在让 BCP 正常工作时遇到了一些问题。我记录了BCP-related question in this StackOverflow post

就短期而言,我只是在我的代码库中添加了一个normal_distribution 函数。我把它从过去的几篇 StackOverflow 帖子中整理出来。这个实现没有做任何花哨的模板的东西,但它看起来非常类似于normal_distribution 的 Boost、TR1 和 C++11 API。

#include "math.h"
double normal_distribution(double mean, double stdDev)
{
    //scale the number to appropriate distribution 
    return mean + (sampleNormal()*stdDev);
}

//get a number from normal distribution (mean=0, stdDev=1). 
double sampleNormal() {
    double u = ((double) rand() / (RAND_MAX)) * 2 - 1;
    double v = ((double) rand() / (RAND_MAX)) * 2 - 1;
    double r = u * u + v * v;
    if (r == 0 || r > 1) return sampleNormal(); //recursively re-generate number if doesn't meet criteria
    double c = sqrt(-2 * log(r) / r);
    return u * c;
}

感谢this StackOverflow post(用户Pete855217)提供sampleNormal()函数,感谢this StackOverflow post(用户5084)提供我命名为normal_distribution()的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多