質問: 質問内容 ----- SWIGというラッパー作成ツールを使ってみているのですが、 Exampleすらまともに動かせない状況です。 とりあえずExampleを試して慣れたいので、動かし方を教えていただきたいです。 ### 環境 括弧()の中はインストール方法です。 macOSX: 10.14.1 Python(pyenv): 3.6.1 pyenv(brew): stable 1.2.8 g++: Apple LLVM version 10.0.0 (clang-1000.10.44.4) swig(brew): stable 3.0.12 ### やったこと ``` $ curl -LO http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz $ tar -xzf swig-3.0.12.tar.gz $ cd swig-3.0.12 $ ./configure $ make $ cd Examples/python/class $ swig -python -c++ example.i $ g++ -O2 -fPIC -c example.cxx $ g++ -O2 -fPIC -c example_wrap.cxx $(python-config --includes) $ g++ -shared example_wrap.o example.o -o _example.so ``` ここまで実行すると、`Undefined symbols for architecture x86_64`というようなエラーが発生してしまいました。 以下に全文を記載します。 エラー内容(gist) よろしくお願いします。
回答: 質問者さんが遭遇している未定義エラーのシンボル`_PyArg_ParseTuple`などはCPythonインタープリタの内部ルーチンだと思います。つまりそれらの実装があるPythonのライブラリーをリンクしていないのが未定義エラーの原因だと思います。 自分の環境はMacintoshではなくWindows10 cygwinなのですが、質問者さんがコンパイル時に使っておられるpython-config(Pythonの環境によってはpython2-config や python3-configになると思います)を使えばプラットフォームの違いを意識せずにほぼ同じ書き方でリンクに必要なオプションが得られると思います。 cygwinでPython 3.6を用いる場合はこんな感じでした。 ``` $ gcc -shared example.o example_wrap.o -o _example.dll $(python3-config --ldflags) ``` Macintoshでも(共有ライブラリーの拡張子がdll->soであることを除けば)同様のオプションでうまく行くのではないでしょうか? なお自分の環境では/usr/bin/python3にexecutableがあり、`python3-config --ldflags`は以下のように展開されてました。 `-L/usr/lib -lpython3.6m -lintl -ldl`