【问题标题】:How do I use boost with the xeus-cling jupyter kernel?如何将 boost 与 xeus-cling jupyter 内核一起使用?
【发布时间】:2020-07-27 00:35:12
【问题描述】:

我正在运行 Pop!_OS(ubuntu 衍生产品)并从默认存储库安装了 boost(libboost-all-dev)。我知道它已正确安装,因为我可以使用 GCC 编译和运行简单的 boost odeint 示例。

但是,当我尝试使用 zeus-cling 内核在 jupyter 笔记本中运行相同的示例时,在包含 odeint 标头时出现错误。我可以在执行此代码时重新创建错误:

#pragma cling add_include_path("/usr/include")
#include <boost/numeric/odeint.hpp>

我得到的错误信息是:

In file included from input_line_8:1:
In file included from /usr/include/boost/numeric/odeint.hpp:22:
In file included from /usr/include/boost/numeric/odeint/config.hpp:44:
In file included from /usr/include/boost/config.hpp:48:
In file included from /usr/include/boost/config/stdlib/libstdcpp3.hpp:78:
/usr/include/unistd.h:756:28: error: expected function body after function declarator
extern __pid_t fork (void) __THROWNL;
                           ^
/usr/include/unistd.h:869:11: fatal error: 'bits/getopt_posix.h' file not found
# include <bits/getopt_posix.h>
          ^~~~~~~~~~~~~~~~~~~~~
Interpreter Error: 

据我了解,bits/getopt_posix.h 是仅 GCC 的标头,因此我认为问题可能是因为 boost 标头正在配置自己,就好像它们在 GCC 下编译而不是紧贴/叮当声一样。

那么,如何在 xeus-cling jupyter notebook 中正确包含 boost?

【问题讨论】:

  • 在这种情况下不需要添加已编译的共享库 (*.so),因为 odeint 只是标题。尽管如此,我还是尝试了。

标签: c++ boost cling xeus-cling


【解决方案1】:

我越来越绝望,最终我的问题得到了以下解决方案。

所以我所做的是将 boost 超级项目作为子模块克隆到我的存储库中,然后添加所有需要的包含路径以使 boost::numeric::odeint 工作。无论如何,Odeint 只是标题,所以它可以工作。这应该适用于所有仅标头的 boost 库。

我的猜测是这不是正确的方法,但它对我有用。只是为了以后的原型制作和小实验。

这里是谐波振荡器示例。

#pragma cling add_include_path("../lib/boost/libs/numeric/odeint/include")
#pragma cling add_include_path("../lib/boost/libs/numeric/ublas/include")
#pragma cling add_include_path("../lib/boost/libs/config/include")
#pragma cling add_include_path("../lib/boost/libs/type_traits/include")
#pragma cling add_include_path("../lib/boost/libs/serialization/include")
#pragma cling add_include_path("../lib/boost/libs/core/include")
#pragma cling add_include_path("../lib/boost/libs/preprocessor/include")
#pragma cling add_include_path("../lib/boost/libs/static_assert/include")
#pragma cling add_include_path("../lib/boost/libs/mpl/include")
#pragma cling add_include_path("../lib/boost/libs/utility/include")
#pragma cling add_include_path("../lib/boost/libs/typeof/include")
#pragma cling add_include_path("../lib/boost/libs/array/include")
#pragma cling add_include_path("../lib/boost/libs/assert/include")
#pragma cling add_include_path("../lib/boost/libs/throw_exception/include")
#pragma cling add_include_path("../lib/boost/libs/units/include")
#pragma cling add_include_path("../lib/boost/libs/integer/include")
#pragma cling add_include_path("../lib/boost/libs/fusion/include")
#pragma cling add_include_path("../lib/boost/libs/range/include")
#pragma cling add_include_path("../lib/boost/libs/iterator/include")
#pragma cling add_include_path("../lib/boost/libs/concept_check/include")
#pragma cling add_include_path("../lib/boost/libs/detail/include")
#pragma cling add_include_path("../lib/boost/libs/function_types/include")
#pragma cling add_include_path("../lib/boost/libs/predef/include")
#pragma cling add_include_path("../lib/boost/libs/math/include")
#pragma cling add_include_path("../lib/boost/libs/lexical_cast/include")
#pragma cling add_include_path("../lib/boost/libs/numeric/conversion/include")
#pragma cling add_include_path("../lib/boost/libs/container/include")
#pragma cling add_include_path("../lib/boost/libs/move/include")
#pragma cling add_include_path("../lib/boost/libs/smart_ptr/include")
#pragma cling add_include_path("../lib/boost/libs/multi_array/include")
#pragma cling add_include_path("../lib/boost/libs/functional/include")
#pragma cling add_include_path("../lib/boost/libs/function/include")
#pragma cling add_include_path("../lib/boost/libs/type_index/include")
#pragma cling add_include_path("../lib/boost/libs/container_hash/include")
#pragma cling add_include_path("../lib/boost/libs/bind/include")


#include <vector>
#include <iostream>
#include "boost/numeric/odeint.hpp"

typedef std::vector< double > state_type;
const double gam = 0.15;

void harmonic_oscillator(const state_type &x , state_type &dxdt , const double t)
{
    dxdt[0] = x[1];
    dxdt[1] = -x[0] - gam*x[1];
}

state_type x(2);
x[0] = 1.0; // start at x=1.0, p=0.0
x[1] = 0.0;

size_t steps = boost::numeric::odeint::integrate(harmonic_oscillator,
                                                 x , 0.0 , 10.0 , 0.1 );

std::cout << steps << std::endl;

【讨论】:

    【解决方案2】:

    那里,

    到目前为止,我一直在使用带有 xeus-cling 内核的 boost(几何),没有任何问题。我从 conda forge 安装 boost (conda install boost -c conda-forge)。 我尝试在我的紧贴环境中包含 odeint.hpp 而没有任何问题:

    ΒW 乔戈斯

    【讨论】:

    • 谢谢,下次我继续做这个项目时我会试试的。这周末。不过这是有道理的。通过 conda 安装而不是使用系统安装。
    猜你喜欢
    • 2019-05-22
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多