2012-05-04 28 views
5

私は現在Boost Pythonを使用してクラスをエクスポートしようとしており、それを対応するプログラムで使用しようとしています。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ではなく、同時にコンパイルされます。とにかく、誰も私ができることについて何か考えがありますか?

+0

今後、外部サイトにリンクするのではなく、関連するコード/エラーをインラインで入力してください。 – ildjarn

+0

ああ、ありがとう!私はctrl-kのすべてを強調表示しようとしましたが、正しく書式設定していませんでした。どのようにしてそれをきれいにフォーマットしましたか? – DubyaDubyaDubyaDot

+0

Ctrl + Kは適切なアプローチですが、それがうまくいかない場合は常にツールバーに '{}'アイコンがあります。 : - ]それは、あなたの質問が何であるか私には明らかではない - なぜ 'init_PyBackend'を気にかけますか?実際の問題は何ですか? – ildjarn

答えて

10

モジュールの初期化関数の命名規則は、次のとおりのPython 2.xの(NO下線)のため

  • init***
  • PyInit_*** for Python 3.x.

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

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

PyInit_PyBackend_sreような下線で始まる名前を持つモジュールに対して、初期化関数はinit_sre/PyInit__sreあること

注(Pythonの3.xの2つの下線に気付きます)。

関連する問題