ここで説明するには長すぎる理由から、Python内で呼び出し可能な共有ライブラリ(libAと呼びます)を「C」で作成する必要があります。この共有ライブラリは、別のカスタム共有ライブラリを呼び出す必要があります(libCudaという名前を付けます)。さらに、libAは、MySQLなどの他の多くの外部共有ライブラリを呼び出します。
libCudaを含める前は、Python内で呼び出されたすべてのC関数は問題なく機能し、MySQLサブ呼び出しは正常に機能していました。ただし、libCudaがlibAに追加されると、Pythonは次のように文句を言います。
caughtError c process - [directory]/libA.so: undefined symbol: cudaFunction1
ご想像のとおり、libCudaはnvccでコンパイルされたnVidia Cudaコードであり、Cリンク可能に設定されています(つまり、関数プロトコルで「C」をエクスポートします)。この共有ライブラリ(libCuda)をスタンドアロンのテストベンチ(記述)でテストしました。 C)で、すべてが期待どおりに機能します。これは、Cudaライブラリをコンパイルするために使用される命令です。
nvcc -arch=sm_30 -shared -o libCuda.so *.cu -Xcompiler -fPIC
私が使用する場合:
$ ldd libA
libAがlibCuda(またはMySQL)をロードする必要があることを示す情報が表示されません
libAのコンパイルに使用されるコマンドは次のとおりです(libCudaはローカルディレクトリにあります)。
gcc *.c -c -L. -lCuda -lmysqlclient [many other shared libraries] -fPIC
gcc -shared -Wl,-soname,libA.so -lCuda -lmysqlclient [many other shared libraries] -o libA.so *.o
両方のライブラリファイルを/usr/ libに配置し、LD_LIBRARY_PATHを明示的にエクスポートしてみました。運がない。どんな助けでも大歓迎です!