Как мне использовать boost с ядром xeus-cling jupyter? - PullRequest
1 голос
/ 14 апреля 2020

Я использую Pop! _OS (производная от ubuntu) и могу установить boost (libboost-all-dev) из репозиториев по умолчанию. Я знаю, что он установлен правильно, так как я могу скомпилировать и запустить простой пример boost odeint с помощью G CC.

Однако, когда я попытался запустить тот же пример в ноутбуке jupyter с использованием ядра zeus-cling, я получил ошибка при включении заголовка 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 - это заголовок только G CC Таким образом, я думаю, что проблема может заключаться в том, что заголовки boost настраиваются так, как если бы они компилировались в G CC вместо cling / clang.

Итак, как правильно включить boost в ноутбуке xeus-cling jupyter?

1 Ответ

1 голос
/ 21 апреля 2020

Я впал в отчаяние, что привело к следующему решению моей проблемы.

Итак, я сделал клон проекта super super в качестве подмодуля в мой репозиторий, а затем добавил все пути включения, необходимые для получения boost::numeric::odeint работает. В любом случае Odeint - это заголовок, поэтому он работает. Это должно работать для всех заголовочных библиотек.

Я предполагаю, что это не правильный путь, но он работает для меня. Это просто для прототипирования и небольших экспериментов позже.

Вот пример генератора гармоник c.

#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;
...