-3

.a ライブラリにコンパイルしている CUDA コードと、それを使用するアプリ用の (CUDA 関連の) 通常の C++ コードがあります。すべてが中間リンクを受けています。

現在、あるマシン (CUDA 8.0 RC を使用) ではビルドは成功しますが、別のマシン (重要な場合に備えて Kepler カードではなく Maxwell を使用) では次のようになります。

/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 回目のリンク」の結果である可能性がありますか?
  • 実際に競合しているものを正確に判断するにはどうすればよいですか (たとえば、 でどのシンボルを探すべきか)。
  • 実際に競合するものがない場合、これを回避するにはどうすればよいですか?

ノート:

  • 1 台のマシンでは CUDA 7.5 を使用しており、もう 1 台のマシンでは CUDA 8.0 RC を使用しています。
4

1 に答える 1