繁体   English   中英

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

[英]How to include the boost library into a C++ program?

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

#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

此代码取自此处

编译器告诉我没有找到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++编译器。

您需要在g ++命令中包含一个包含路径:

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

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

通常,在源代码中放置完整路径并不是一个好主意。 那种完全破坏便携性的想法:)(意思是,代码不再被任何其他个人电脑在世界上编译比你自己的,甚至认为将是一年半可疑从现在起)。

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

您可能也会发现这个问题很有趣。

(这不是问题的直接答案,但我认为应该用@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的Boost部分简化了许多注意事项,当然,有时您也需要其他部分。

需要考虑的事项:

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

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

-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。 也许你有一些提升包括已经导出到某个环境变量的补丁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM