私は、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)
'readelf -d youlib.so'はlibpython3.5mへの依存関係を示していますか?リンカーはそれを取り除いた可能性があります。 – yugr
これは依存関係があります。 – chasep255