使用boostpython访问引用其他类的特定函数

2024-10-01 07:43:40 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我是C++新手,但我有一个C++文件,我想创建一个Python模块,用于访问C++中运行的特定函数。我正试图使用boostpython来实现这一点,但我只对能够访问文件中定义的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(它通过递归includes引用许多其他类)。你知道吗

在教程之后,我希望我只需要声明这个函数,但是在尝试使用设置.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使用的其他类呢?你知道吗

编辑

感谢您在上的注释,将此添加到.h文件解决了我的问题。我现在可以跑了设置.py成功。你知道吗

但是-当我将生成的.so导入Python时,我得到:

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

我的生活中有什么遗漏吗设置.py?你知道吗

是否需要将“omp”目录添加到设置.py例如文件?你知道吗

谢谢你的帮助。你知道吗


Tags: 文件getstringargsfunctionintstddouble