c++ - 如何将 boost 与 xeus-cling jupyter 内核一起使用?
问题描述
我正在运行 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 下编译而不是 cling/clang 一样。
那么,如何在 xeus-cling jupyter 笔记本中正确包含 boost?
解决方案
我越来越绝望,最终解决了我的问题。
所以我所做的就是将 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;
推荐阅读
- c# - 使用 Automapper 没有映射错误`缺少类型映射配置或不支持的映射`
- php - 当 PHP 等待用户输入时,如何定期调用函数?
- python - 在python 3中创建一个总单词数的字典
- android - 如何在相同的 x,y 值上管理多个标记视图
- php - SQL 语句中的 OR 运算符没有给出正确的结果
- python - 如何比较矩形并找到相似的?
- typescript - TypeScript overloads doesn't chose the expected one
- c - 使用递归扫描多个数字并计算扫描了多少偶数(在 c 中)
- c++ - 复制后 C++ 程序不需要管理员/UAC
- javascript - 使用 div 在图像顶部的位置的画布 drawImage