Open16

C++でPython開発したい

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

https://github.com/pybind/cmake_example
cmakeを利用したサンプル。
pybind11 はサブモジュールとして設定されているので、
git clone したら
git submodule update --init --recursive
する。
ビルドする時は、cmakeのコマンドを実行するのではなく、Pythonのsetup.py側にcmakeコマンドが
書かれているので、
pip install ### で、ビルドができるようになっている。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

cmdclass で、コマンド名からCmommandサブクラスへのマッピング。
このマッピングされているクラス内で、
cmakeのコマンドを作り、subprocessで実行している。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

マッピングしている build_ext は、パッケージ中の拡張を構築する。
他には build_clib( パッケージ中のCライブラリを構築) build_py パtぅケージ中の .py .pycファイルを構築
というのがある。
マッピング用の dict の key がこのいずれか、実際にマッピングされた動作本体が、dictのvalueとして指定されたクラス。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

準備する必要があるのは
setup.py CMakeLists.txt pybind11をサブモジュール化。
C++側の関数を呼び出すには
PYBIND11_MODULE を使う。

m.def(名前、呼び出す関数、docs);

で登録。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

PythonでImportしたときに

dynamic module does not define module export function pybind11
でエラーになる。
これは

PYBIND11_MODULE(cmake_example, m)
{
}

ここで指定する モジュール名と、CMakeLists.txtやsetup.py で指定するモジュール名が
一致していないとだめだった。

個々の名前は
CMakeLists.txtの

add_subdirectory(pybind11)
pybind11_add_module(cmake_example src/main.cpp)

ここ。