15

私はファイルにmylibコンパイルするC++ライブラリ(それを呼びましょう)を持っており、で呼ばれるディレクトリにたくさんのヘッダーファイルがあります。libmylib.so/usr/local/libmy lib/usr/local/include

今私がやりたかったこと(初心者向け)は、SWIGでヘッダーファイルの1つ(ライブラリが提供しているクラスに関する情報が含まれています)を使用してmylib_wrap.cxxファイルを生成し、コンパイルして既存のファイルにリンクすることmylib.soです。Pythonでクラスをインスタンス化できるようにします。

これは正しいアプローチ/アイデアですか?コンパイルおよびリンクコマンドはどのようになりますか(もちろん正確ではありません)?Pythonバインディングを生成しようとしています。

4

1 に答える 1

33

私はあなたのために完全な例をまとめました:

ヘッダーファイル:

(mylib.h)

class Foo {
};

void bar(const Foo&);

実装:

#include "mylib.h"
#include <iostream>

void bar(const Foo& f) {
  std::cout << &f << std::endl;
}

ライブラリをコンパイルします。

g ++ -fPIC -Wall -Wextra -shared mylib.cc -o libmylib.so

ライブラリをラップするSWIGインターフェイス:

%module mylib

// Make mylib_wrap.cxx include this header:
%{
#include "mylib.h"
%}

// Make SWIG look into this header:
%include "mylib.h"

Pythonモジュールをコンパイルします。

swig -Wall -c ++ -python mylib.i  
g ++ -fPIC -Wall -Wextra -shared mylib_wrap.cxx -o_mylib.so-L。-lmylib -I / usr / include / python2.7 / -lpython2.7

Pythonモジュールをライブラリにリンクしたことに注意してください。現在のディレクトリにない場合は、ライブラリパスを指定する必要があります。SWIGは、Pythonモジュールのネイティブ部分が_module.soと呼ばれることを想定しています。

走る

LD_LIBRARY_PATH=。Python                                                 
Python 2.7.2 +(デフォルト、2011年11月30日、19:22:03)
linux2の[GCC4.6.2]
詳細については、「help」、「copyright」、「credits」、または「license」と入力してください。
>>>インポートmylib
>>> i = mylib.Foo()
>>> mylib.bar(i)
0x28cc100
>>> mylib.bar(i)
0x28cc100
>>> mylib.bar(mylib.Foo())
0x28b3b10

ここでは、LD_LIBRARY_PATHを適切に設定して、作成した共有オブジェクトがライブラリパス上にあることを確認しました。

于 2012-04-12T15:28:52.797 に答える