from PGI でmain.cpp
コンパイルされた私の C++ プロジェクトは、 でコンパイルされた別のファイルに CUDA コードを含む関数を呼び出します。関数宣言と共通ヘッダー ファイルで関数をラップしないと、リンク エラー (未定義の参照) が発生します。pgcpp
cuda()
cuda.cu
nvcc
cuda()
extern "C"
なしextern "C"
(シンボル名の不一致 => 未定義参照):
$ nm main.o | grep -y cuda
U cuda__FPfPiT2iN32
$ nm cuda.o | grep -y cuda
T _Z13cudaPfPiS0_iS0_S0_S0_
extern "C"
(シンボル名の一致 => リンクは正常に動作します) :
$ nm main.o | grep -y cuda
U cuda
$ nm cuda.o | grep -y cuda
T cuda
nvcc
ホスト コードにホスト C++ コンパイラを使用したため、C++ のようにシンボル名をマングルするというのが私の印象でした。私は何を間違っていますか?
編集:これは、ホスト コードにnvcc
GNU コンパイラgcc
を実際に使用し、このコンパイラが名前を異なる方法でマングルするという事実によるものpgcpp
でしょうか?
EDIT2:私のシステムにはpgcpp 14.9、gcc 4.4.7、nvcc/CUDA 6.5があります