我正在尝试编译这个小程序:
#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++
编译器。
答案 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的仅限标题部分简化了许多注意事项,当然,有时您也需要其他部分。
需要考虑的事项:
答案 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包含补丁已经导出到某个环境变量。