Python 用の ctypes モジュールを使用して C++ ライブラリをラップしようとしています。以前の投稿とthisから、オブジェクト名が壊れないように「extern C」を使用してパブリック インターフェイスをラップする必要があることがわかりました。
私のパブリック インターフェイスは 1 つの関数呼び出しにすぎません (クラス ラッピングなどはありません)。しかし、私の C++ ライブラリは、それ自体でクラスの静的メンバー オブジェクトを広範囲に使用します。C++ ライブラリをコンパイルすると、常に次のような結果になることがわかりました。
OSError: /mylib.so: undefined symbol: _ZN4bitarr_10lenE
未定義シンボルのマングル名から、それらがクラスで定義された静的オブジェクトであることがわかります。これらの静的オブジェクトは C++ 側でのみ使用され、Python からインターフェイスするためにラップされることは意図されていません。ctypes が文句を言わないように、.so ファイルのパブリック シンボル名からそれらを除外する方法はありますか? より具体的には、.so ファイルを次のようにコンパイルしました。
g++ -shared -Wl,-soname,mylib -o mylib.so publiclib.o privatelib.o
このように、すべての関数はパブリック インターフェイスとしてラップされます (それらが publiclib.o または privatelib.o からのものであるかどうかに関係なく)。私の質問は、publiclib.o のシンボルのみを公開し、privatelib.o のシンボルは公開しない方法だと思います。
ps 私が ctypes を選んだのは、私の Python へのインターフェースが本当に単純だからです (C++ 関数を 1 回呼び出すだけです)。Cython や Boost.Python などの代替ソリューションを調べて検討しましたが、コードを配布するときに Boost や Cython をバンドルする必要があることに懸念があります。python/c++ の相互作用に関する私の限られた知識から、ctypes はより移植性の高い方法のようです。
編集:置くことで特定の関数とメンバー関数の露出を抑制することができるようです
__attribute__ ((visibility ("hidden"))
宣言へ。しかし、クラスの静的メンバー変数に対してこれを行った場合、リンカーはリンクに失敗し、報告します
relocation R_X86_64_32S against `bitarr_len` undefined symbol cannot be used when making a shared object
ctypes の共有ライブラリを作成する際に静的クラス メンバーを使用する方法についての洞察はありますか?