6

現在、Boost Python を使用してクラスをエクスポートし、対応するプログラムで使用しようとしています。

/**
    main.cpp
*/
#define BOOST_PYTHON_STATIC_LIB
#include <Resource\ZipResourceFile.hpp>
#include <Resource\ResourceCache.hpp>
#include <Windows.h>
#include <boost/python.hpp>
#include <iostream>

/* a simple add method, for s & g's */
int add(int a, int b)
{
    return a + b;
}

/* Foo class*/
class Foo
{
public:
    Foo(int n);
    ~Foo();
    void f();
};

/* Foo ctor, does nothingm just wanted to pass and arg */
Foo::Foo(int n)
{

}

/* destructor */
Foo::~Foo()
{
}

/* f() implementation, calls Foo!!! to cout */
void Foo::f()
{
    std::cout << "Foo!!!" << '\n';
}

/* Boost python module definition */
BOOST_PYTHON_MODULE(PyBackend)
{
    using namespace boost::python;

    def("add", add);
    class_<Foo>("Foo", init<int>())
        .def("f", &Foo::f);
}



int main(int argc, char* argv[])
{
    PyImport_AppendInittab("PyBackend", init_PyBackend);
    Py_Initialize();
    PyRun_SimpleString("import PyBackend");
    PyRun_SimpleString("foo = PyBackend.Foo(1)");

    Py_Finalize();

    {
        int n;
        std::cin >> n;
    }
    return 0;
}

とにかく、Boost.Python を使用していない場合に呼び出す論理的なもののように思えますが、関数 init_PyBackend がどこにあるのかわかりません。

モジュール自体は別の DLL ではなく、すべて同時にコンパイルされます。とにかく、私に何ができるかについて何か考えがある人はいますか?

4

1 に答える 1

11

モジュール初期化関数の命名規則は次のとおりです。

  • init***Python 2.x 用 (アンダースコアなし)。
  • PyInit_***Python 3.x 用。

Boost.Python のBOOST_PYTHON_MODULEマクロは、これらの規則に従います。

Python 3.2 を使用しているPyBackendため、モジュールの初期化関数が呼び出されます。

PyInit_PyBackend.

のように名前がアンダースコアで始まるモジュールの_sre場合、init 関数はinit_sre/であることに注意してくださいPyInit__sre(Python 3.x では 2 つのアンダースコアに注意してください)。

于 2012-05-04T04:14:25.400 に答える