16

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

#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++编译器。

4

3 回答 3

19

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

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

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

一般来说,在源代码中放置完整路径并不是一个好主意。这种完全破坏了可移植性的想法 :) (这意味着,除了您自己的计算机之外,该代码不能再在世界上的任何其他 PC 上编译,即使从现在起半年之后也是值得怀疑的)

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

你可能也会觉得这个问题很有趣。

于 2013-06-19T07:06:39.073 回答
7

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

使用 C++ 处理 3rd 方依赖项的问题并不简单。有很多方法可以做到这一点,选择适合您的方法取决于您的工具集和环境、您的项目管理以及您想要采取的权衡取舍。

对于 Boost,我们必须记住,它主要是仅包含头文件的库,但某些组件也包含单独编译的部分(可以是静态或动态库,可以是组件的必需库,也可以仅针对它的特定用例) . 例如 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(至少在您明确决定更改版本之前)还是希望它使用特定机器上安装的任何内容(假设没有 API 更改)?
  4. 您是否可以在项目中拥有 Boost(或其中的一部分)的副本,或者您想要一个供所有项目使用的中心位置?
  5. 您希望对用户(最终用户或开发人员,取决于上述其他问题)强制执行多少手动配置步骤?(0 可能是首选,但总是需要权衡取舍。)
  6. 您的项目是否仅限 Windows、仅限 Linux 等?每个平台都有自己的方法,根据您对其他问题的回答,您应该使用的方法可能因操作系统而异。对于我们的主题,跨平台通常意味着您必须为要支持的每个平台实施相关方法。
  7. 您的工具集和构建环境是什么(例如 Visual Studio、Qt、make、简单脚本等)?
于 2016-08-11T09:56:25.927 回答
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现在它更具可读性。

暗示:

使用生成文件。也许你有已经导出到某个环境变量的 boost 包含补丁。

于 2016-08-10T18:34:06.680 回答