如何将boost库包含到C ++程序中?

时间:2013-06-19 07:03:10

标签: c++ boost compiler-construction include

我正在尝试编译这个小程序:

#include <boost/math/distributions/poisson.hpp>

namespace boost { namespace math {

template <class RealType = double, 
          class Policy   = policies::policy<> >
class poisson_distribution;

typedef poisson_distribution<> poisson;

template <class RealType, class Policy>
class poisson_distribution
{ 
public:
  typedef RealType value_type;
  typedef Policy   policy_type;

  poisson_distribution(RealType mean = 1); // Constructor.
  RealType mean()const; // Accessor.
}

}} // namespaces boost::math

此代码取自here

编译器告诉我找不到boost/math/distributions/poisson.hpp。所以,我尝试自己找到这个文件(使用locate poisson.hpp命令)。我找到了以下文件:/opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include/boost/math/distributions/poisson.hpp。因此,在我的代码中,我放置了文件的全名,以确保编译器找到它:

#include </opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include/boost/math/distributions/poisson.hpp>

但现在我收到另一条错误消息:找不到boost/math/distributions/fwd.hpp

有没有办法强制编译器搜索正确目录中的文件?

我使用g++编译器。

3 个答案:

答案 0 :(得分:19)

您的g ++命令中需要包含路径:

g++ -I/opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include/  [rest of command here]

(也可能是指向库路径的链接)。

通常,在源代码中放置完整路径是 的好主意。那种彻底摧毁了可移植性的想法:)(意思是,这个代码不能再在世界上任何其他PC上编译而不是你自己的,甚至 将半年可疑从现在开始)。

无论如何,如果你发现自己输入了如上所述的长编译器行,那么现在是时候开始使用makefile了。

你可能会发现this question也很有趣。

答案 1 :(得分:6)

(这不是问题的直接答案,但是我认为应该用@uoɥʇʎPʎzɐɹC想要在这里看到的最终和完整答案来解决一系列考虑因素。)

使用C ++处理第三方依赖关系的问题并不简单。有很多种方法,选择适合您的方法取决于您的工具集和环境,项目管理以及您想要的权衡取舍。

对于Boost,我们必须记住它主要是只有头的库,但是一些组件也包括一个单独编译的部分(可以是静态或动态lib,对于组件可以是强制性的,也可以仅用于特定用例)它)。 例如。 Boost.Filesystem需要编译,Boost.Graph仅在你想要解析GraphViz文件时才需要它,而Boost.Variant根本不需要它(是“仅限标题”的库)。 有关详细信息,请参阅http://www.boost.org/doc/libs/release/more/getting_started/unix-variants.html#header-only-libraries(此重定向到最新版本,目前为1.61)。

仅使用Boost的仅限标题部分简化了许多注意事项,当然,有时您也需要其他部分。

需要考虑的事项:

  1. 您是否只使用Boost的标题部分,或者您需要一个 单独编译的部分呢?如果你需要单独编译 部分,您使用静态库还是动态库?如果你使用 单独编译的部分,并希望使用动态库,你必须 决定在运行应用程序时如何查找动态库 (特别是如果您将项目分发为二进制文件)。
  2. 您的项目是作为源还是以二进制形式分发?在二进制文件中 例如,您主要担心开发人员的工作流程(但请参阅 关于使用动态库的上述观点)。在源案例中,您想要 它很容易在其他每台计算机上编译。
  3. 您希望您的项目坚持使用相同版本的Boost(at 至少直到你明确决定改变版本)或你想要它 使用特定机器上安装的任何东西(假设在那里 没有API更改)?
  4. 你是否可以获得Boost(或部分)的副本 项目或者您希望所有项目都使用中心位置?
  5. 您希望对用户强制执行多少手动配置步骤(结束 用户或开发者,取决于上面的其他问题)? (0是 可能更喜欢,但总是需要权衡。)
  6. 您的项目是仅限Windows,仅限Linux,等等?每个平台都有 它自己的方式,取决于你对其他问题的答案, 您应该使用的方法因操作系统而异。 对于我们的主题,跨平台通常意味着您必须这样做 为您想要的每个平台实施相关方法 支持。
  7. 您的工具集和构建环境是什么(例如Visual Studio,Qt, 制作,简单的脚本等。)?

答案 2 :(得分:1)

指定搜索包含文件的目录:

-I /opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include

指定搜索库的目录:

-L /opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/lib

指定实际的库名称:

-l foo
  

当您的库名为lib foo .a

您不必在-I-L-l之后写空格,因为它现在更具可读性。

<强>提示:

使用Makefile。也许你已经将boost包含补丁已经导出到某个环境变量。