2

関数 void A() を含むファイル A.cu があります。cuda 関数 A() を呼び出し、次のような関数宣言を持つ別のファイル test_A.c があります。

extern void A();

今、私は次のようにそれらをコンパイルしてリンクします

nvcc -c -o A.o A.cu 
gcc -o test_A test_A.c A.o /opt/cuda-4.0/cuda/lib64/libcudart.so

そして、私は次のようなエラーが発生します

undefined reference to `A'

私は何が欠けていますか?

4

1 に答える 1

5

問題はおそらく C++ の名前マングリングです。CUDA コードは、C コンパイラではなく、C++ コンパイラでコンパイルされます。の内容をダンプすると、C コンパイラが期待するものではなく、のA.oようなシンボルが見つかるはずです。_Z1AvA

これを克服するには、A.cuファイル内で次の宣言を使用できます。

extern "C" void A(void)
{
    .......
}

これにより、C++ コンパイラはコードのコンパイル時に C 規則を使用するようになり、適切な名前の関数がオブジェクト ファイルに書き込まれA.o、C コンパイラとリンカーが理解できるようになります。

于 2012-04-25T07:26:38.083 に答える