Я новичок в 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?
Спасибо за вашу помощь.