2017-01-28 14 views
0

私は、c拡張を作成することによって、いくつかのpythonコードをkdbデータベースに埋め込む作業を進めています。これを行うには、自分のコードを共有ライブラリにコンパイルし、kdb qスクリプト内で共有ライブラリをロードする必要があります。この問題は、numpyモジュールをインポートしようとするときに発生します。 PyType_GenericNewが定義されていないというエラーが表示されます。これは、コンパイル時ではなく実行時に発生します。共有オブジェクトへのフルパスを取得するpython c api

ビルドしている共有ライブラリはlibpython3.5m.soにリンクされていますが、シンボルを大胆にエクスポートしないと思います。 main()内でnumpyをインポートするテスト実行ファイルを作成したとき、正常に動作します。 dlopen("libpython3.5m.so", RTLD_NOW | RTLD_GLOBAL)を呼び出して、この問題を共有ライブラリで解決できました。しかし、私はこのソリューションがあまり好きではないので、私は本当にこのソリューションを気に入っていません。例えばlibpython3.4mのようなコンパイルオプションを変更したとします。次に、ソースコードを変更する必要がありますので、dlopenはlibpython3.4mを開きます。

-lpython3.5mオプションを使用してすべてのシンボルをグローバルにエクスポートするときにgccに通知する方法はありますか?このようにして、私はdlopenをスキップできます。

そうでなければ、私が現在使っているpython共有ライブラリのパスを教えてくれるPythonのc apiに何かがありますか?つまり、dlopen(Py_GetLibraryPath(), RTLD_NOW | RTLD_GLOBAL)

+0

'readelf -d youlib.so'はlibpython3.5mへの依存関係を示していますか?リンカーはそれを取り除いた可能性があります。 – yugr

+0

これは依存関係があります。 – chasep255

答えて

0

あなたの問題は、シンボルをエクスポートすることとは関係ありませんが、動的リンカーはPyType_GenericNewです。ライブラリパスにlibpython3.5m.soがあり、ダイナミックリンカーがそれを見つけられない場合は、strace ldd ./programを実行すると、どこを探しているかのヒントが得られ、うまく配置されたシンボリックリンクがあなたを並べ替えるかもしれません。

関連する問題