Использование Boost Python для доступа к определенной функции, которая ссылается на другие классы - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в C ++, но у меня есть файл C ++, из которого я пытаюсь создать модуль Python для доступа к определенной функции, запускаемой в C ++.Я пытаюсь использовать Boost Python для этого, но меня интересует только возможность доступа к функции get_equities(), определенной в файле.

test.cpp:

#include "omp/EquityCalculator.h"
#include <iostream>
#include <boost/python.hpp>

using namespace omp;
using namespace std;

// Function prototype (declaration)
vector<double> get_equities(vector<string> args);

int main(int argc, char *argv[])
{
    vector<string> args(argv, argv + argc);
    vector<double> equities;
    equities = get_equities(args);
};

vector<double> get_equities(vector<string> args) {

    int argc = args.size();

    string board_string = args[1];

    EquityCalculator eq;
    vector<CardRange> ranges;
    for( int i = 2; i < argc; i++ ) {
        ranges.push_back(args[i]);
    };

    uint64_t board = CardRange::getCardMask(board_string);

    eq.start(ranges, board);
    cout << "running" << endl;
    eq.wait();

    vector<double> result;

    auto r = eq.getResults();
    // 2 to 4; 2 to 3
    //todo: 
    for( int i = 2; i < argc; i++ ) {
        result.push_back(r.equity[i - 2]);
    }
    cout << result[0] << endl;
    return result;

}

BOOST_PYTHON_MODULE(cpp_equity)
{
    using namespace boost::python;
    def("get_equities", get_equities);

}

Это относится к отдельному классу EquityCalculator (который относится к ряду других классов посредством рекурсивных включений).

После обучения я надеялся, что мне нужно будет только объявить эту функцию, однако при попытке использовать setup.py я получаю несколько ошибок:

In file included from test.cpp:1:0:
omp/EquityCalculator.h:76:21: error: ‘std::function’ has not been declared
                std::function<void(const Results&)> callback = nullptr,
                     ^~~~~~~~
omp/EquityCalculator.h:76:29: error: expected ‘,’ or ‘...’ before ‘<’ token
                std::function<void(const Results&)> callback = nullptr,
                             ^
omp/EquityCalculator.h:202:10: error: ‘function’ in namespace ‘std’ does not name a template type
     std::function<void(const Results& results)> mCallback;
          ^~~~~~~~
omp/EquityCalculator.h:74:10: error: default argument missing for parameter 6 of ‘bool omp::EquityCalculator::start
(const std::vector<omp::CardRange>&, uint64_t, uint64_t, bool, double, int)’
     bool start(const std::vector<CardRange>& handRanges, uint64_t boardCards = 0, uint64_t deadCards = 0,
          ^~~~~

Означает ли это, что мне нужно объявить класс EquityCalculator и любые методы доступа?Как насчет других классов, которые EquityCalculator использует?

EDIT

Спасибо за примечание, добавление этого в файл .h решило мою проблему.Теперь я могу успешно запустить setup.py.

Однако - когда я импортирую сгенерированный .so в Python, я получаю:

ImportError: ./cpp_equity.so: undefined symbol: _ZN3omp13CombinedRangeC1Ev

Я что-то упустил в своем файле setup.py?

Нужно ли где-нибудь добавить каталог 'omp', например, в аргументах Extension () в файле setup.py?

Спасибо за вашу помощь.

...