Не могу скомпилировать С++, который использует odeint из boost

Я использую Ubuntu 12.04, и в /usr/include уже есть некоторые файлы повышения. я сделал

sudo apt-get install libboost-all-dev

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

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



using namespace std;
using namespace boost::numeric::odeint;

typedef vector< double > state_type;

const double sigma = 10.0;
const double R = 28.0;
const double b = 8.0 / 3.0;

void lorenz( state_type &x , state_type &dxdt , double t )
{
    dxdt[0] = sigma * ( x[1] - x[0] );
    dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
    dxdt[2] = x[0]*x[1] - b * x[2];
}

int main()
{
    const double dt = 0.01;

    state_type x(3);
    x[0] = 1.0 ;
    x[1] = 0.0 ;
    x[2] = 0.0;
    stepper_euler< state_type > stepper;
    stepper.adjust_size( x );

    double t = 0.0;
    for( size_t oi=0 ; oi<10000 ; ++oi,t+=dt )
    {
        stepper.do_step( lorenz , x , t , dt );
        cout << x[0] << " " << x[1] << " " << x[2] << endl;
    }
}

При первой компиляции g++ -o test test.cpp возникла ошибка /usr/include/boost/numeric/odeint.hpp permission denied

Поэтому я рекурсивно изменил права доступа ко всем файлам odeint, используя

sudo chmod -R +x odeint/

На этот раз он не сообщил об отказе в доступе, а выдал 400 строк ошибок, как можно увидеть здесь -> журнал ошибок с терминала

Как мне его скомпилировать? В документации или где-либо еще нет руководств по установке odeint.


person Community    schedule 09.11.2013    source источник
comment
Прежде всего: существует ли файл?   -  person stefan    schedule 09.11.2013
comment
Да, все необходимые файлы существуют   -  person    schedule 09.11.2013
comment
Может ли быть так, что odeint не совместим с версией boost из репозиториев Ubuntu и что нет другой альтернативы, кроме как установить последнюю версию boost из исходного кода, которая по умолчанию поставляет odeint?   -  person    schedule 09.11.2013
comment
Затем начните с первой ошибки, указанной в журнале: /usr/include/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp:307:42: error: ‘bind’ is not a member of ‘boost::numeric::odeint::detail’. Убедитесь, что это на самом деле первый. Вы можете скомпилировать с -Wfatal-errors, чтобы прервать при первой ошибке.   -  person stefan    schedule 09.11.2013
comment
@stefan С флагом -Wfatal-errors он дает: - 'В файле, включенном из /usr/include/boost/numeric/odeint/stepper/base/explicit_stepper_base.hpp:25:0, из /usr/include/boost/numeric /odeint/stepper/euler.hpp:23, из /usr/include/boost/numeric/odeint.hpp:27, из test.cpp:2: /usr/include/boost/numeric/odeint/util/bind.hpp :44:14: ошибка: 'std::bind' не объявлено, что компиляция прекращена из-за -Wfatal-ошибок'   -  person    schedule 09.11.2013
comment
Попробуйте скомпилировать с -std=c++0x или -std=c++11.   -  person stefan    schedule 09.11.2013
comment
@stefan На самом деле я хочу скомпилировать, используя nvcc, который удаляет и передает только часть C++ в gcc, но опять же не повезло с -std=c++0x   -  person    schedule 09.11.2013
comment
Хорошо, но он показывает другую ошибку? Кстати: какую версию компилятора вы используете? Выполнить g++ -v.   -  person stefan    schedule 09.11.2013
comment
gcc версии 4.6.3, и он бросил это с -std=c++0x test.cpp: In function ‘int main()’: test.cpp:30:5: error: ‘stepper_euler’ was not declared in this scope compilation terminated due to -Wfatal-errors.   -  person    schedule 09.11.2013
comment
Ну тогда решите эту проблему. Я не знаю, где объявлено stepper_euler. Найдите его и включите соответствующий заголовок.   -  person stefan    schedule 09.11.2013
comment
Вы можете попытаться скомпилировать его, добавив опцию -std=c++0x в gcc? какую версию gcc вы используете?   -  person iyasar    schedule 09.11.2013
comment
@iyasar Да, пожалуйста, обратитесь к предыдущим комментариям   -  person    schedule 09.11.2013
comment
В odeint нет степпера stepper_euler. Я предполагаю, что пример, который вы используете, взят из старой версии odeint. Какая версия Boost установлена? Вы использовали odeint из репозитория git или из буста?   -  person headmyshoulder    schedule 09.11.2013
comment
@headmyshoulder В моей ванильной установке Ubuntu 12.04 не было odeint в папке boost/numeric. Итак, я скачал odeint с github и сделал sudo cp по нужному пути повышения.   -  person    schedule 09.11.2013


Ответы (1)


Эта часть boost, кажется, использует возможности C++11. Поэтому вам нужно добавить -std=c++0x или -std=c++11 к вызову вашего компилятора.

Последующая ошибка test.cpp: In function ‘int main()’: test.cpp:30:5: error: ‘stepper_euler’ was not declared in this scope указывает на другой источник ошибки: вы забыли включить файл, в котором объявлено stepper_euler. Поместите соответствующий #include <file> в начале вашего кода.

person stefan    schedule 09.11.2013
comment
@headmyshoulder Ошибка компилятора, указанная в комментариях, предполагает обратное. Кажется, используется std::bind, который является С++ 11. - person stefan; 09.11.2013
comment
Я уверен, что это работает и без C++11 (я один из авторов). Есть макросы препроцессора, проверяющие, включен ли C++11. Если это так, он использует std::bind, другие boost::bind. - person headmyshoulder; 09.11.2013
comment
@headmyshoulder это может быть ошибка пользователей в том, что используется std::bind (и недоступен из-за отсутствия -std=c++0x), но из того, что показывает OP, это кажется маловероятным. Я подозреваю ошибку в логике выбора boost::bind. - person stefan; 09.11.2013
comment
headmyshoulder и /stefan, оба правы. odeint несовместим с версией boost [1.42] в репозиториях Ubuntu. Я получил последнюю версию от sourceforge и все собрал. Затем последовал совету Стефана, и он скомпилировался. Опубликованный пример относится к более старой версии odeint, как правильно указал @headmyshoulder. Спасибо за вашу помощь, люди :) - person ; 09.11.2013