私はいくつかのCUDAコードを持っています。私は.aライブラリとそれを使用するアプリケーション用の(CUDA関連の)通常のC++コードにコンパイルしています。すべてが中間のリンクを受けています。CUDAコードとのリンクエラー:__cudaRegisterLinkedBinary_の複数の定義
さて、一台のマシン上でビルドが成功しますが、別のマシン上で(マクスウェルはなく、ケプラーカードと、ケースには重要)(CUDA 8.0 RCで)私が手:
/tmp/tmpxft_00001796_00000000-2_ktkernels_intermediate_link.reg.c:25: multiple definition of `__cudaRegisterLinkedBinary_66_tmpxft_00007a5f_00000000_16_cuda_device_runtime_compute_52_cpp1_ii_8b1a5d37'
CMakeFiles/tester.dir/tester_intermediate_link.o:/tmp/tmpxft_0000180b_00000000-2_tester_intermediate_link.reg.c:4: first defined here
collect2: error: ld returned 1 exit status
CMakeFiles/tester.dir/build.make:1766: recipe for target 'bin/tester' failed
make[2]: *** [bin/tester] Error 1
私は実際にライブラリコードを呼び出すバイナリにコンパイルされたファイルからファイルを削除し始めました。そして、それらのファイルをすべて削除するとリンクが成功します。
私の質問:どのような状況下では
- は、そのような一貫性のない動作が発生することは可能でしょうか?
- これは、ライブラリとバイナリ両方の "2番目のリンク"の結果かもしれませんか?
- 実際に何が衝突しているかを正確に判断するにはどうすればよいですか(たとえば、どのようなシンボルを探すか)
- 実際に何も衝突していない場合は、これを避けるために何をすべきですか?
注:私は他のマシン上で、CUDA 7.5使用してい
- マシン1上では、CUDA 8.0 RCです。
'C++ filt'のようなツールを使用して名前をデマングルすることができます。 –
@ JesperJuhl:その識別子はmanglingのために謎めいたものではありません。 – einpoklum