1

テストのために、C(cuda) で行列乗算のコードを作成し、nvcc を使用してコンパイルし、次のコマンドを使用して共有ライブラリを作成しました。

nvcc -c MatMul.cu -o libmatmul.so

次に、CでOpenCVコードを書き、次のコマンドでコンパイルしようとしました。

gcc ImgMul.c `pkg-config --cflags --libs opencv` -L. -L/usr/local/cuda/lib64 -I/usr/local/cuda/include -I. -lmatmul -lcudart -o ImgMul

次のエラーが表示されます。

gputest.c:(.text+0x3f): undefined reference to `matmul'

gcc でコードをコンパイルするときに cuda ライブラリを含める方法を教えてください。

OS: Ubuntu gcc: 4.4.0

4

1 に答える 1

1

最初に指摘する点は、

nvcc -c MatMul.cu -o libmatmul.so

は共有ライブラリを作成せず、オブジェクト ファイルにコンパイルするだけです。共有ライブラリとオブジェクト ファイルはまったく同じではありません。

それはさておき、シンボルが見つからないというエラーの理由は、C++名マングリングです。CUDA ソース ファイル内のホスト コードは、C ではなく、ホスト C++ コンパイラを使用してコンパイルされます。そのため、コンパイラによって生成されたホスト コード内のシンボル名は、名前マングリングの対象となります。これを回避する最も簡単な方法は、宣言子を使用してプレーンな C コードから呼び出したい関数を宣言することです( C/C++ の相互運用性の危険性に関する合理的な概要については、こちらextern "C"を参照してください)。

于 2011-07-28T10:04:01.250 に答える