5

現在、Cuda 5のオブジェクトリンク機能を使用するプロジェクトに取り組んでいます。プロジェクトが複雑になり始めているため、cmakeを使用してコードをコンパイルするように切り替えたいと思いました。ただし、オブジェクトリンクを正しく機能させることができないようです。

元のプロジェクトと同じ種類のエラーが発生するおもちゃバージョンのプロジェクトを作成することになりました。おもちゃのプロジェクトは、GPU上で実行するカーネル関数を呼び出すメインファイル(TextureMain.cu)で構成されています。各GPUスレッドでは、ユーザー定義クラス(TextureFunc)のインスタンスが参照されます。このクラスは、メインファイルとは別のフォルダーに存在します。このクラスは、そのフォルダー内のTextureFunc.cuファイルとTextureFunc.hファイルで構成されます。

これが私が使用しているCMakeList.txtファイルです:

プロジェクトディレクトリ(srcディレクトリを含む):

project(TextureMain)
cmake_minimum_required(VERSION 2.8)
find_package(CUDA REQUIRED)
#-------------------------------------------------------------------------------
set(CUDA_NVCC_FLAGS "-arch=compute_20; -code=sm_20; -rdc=true; -lcudadevrt")
include_directories(src/TextureFunc)
#-------------------------------------------------------------------------------
add_subdirectory(src/TextureFunc)
add_subdirectory(src)

srcディレクトリ(TextureMain.cuおよびTextureFuncディレクトリを含む):

cuda_add_executable(TextureMain TextureMain.cu)
target_link_libraries(TextureMain TextureFunc)
install(TARGETS TextureMain DESTINATION bin)

TextureFuncディレクトリ(TextureFunc.hとTextureFunc.cuを含む):

cuda_add_library(TextureFunc TextureFunc.cu )
target_link_libraries(TextureFunc)

上記のCMakeList.txtファイルを使用してこのコードをコンパイルしようとすると、次のエラーが発生します。

Linking CXX executable TextureMain
CMakeFiles/TextureMain.dir/./TextureMain_generated_TextureMain.cu.o: In function `__sti____cudaRegisterAll_46_tmpxft_00004c15_00000000_6_TextureMain_cpp1_ii_texRef':
/tmp/tmpxft_00004c15_00000000-3_TextureMain.cudafe1.stub.c:2: undefined reference to `__cudaRegisterLinkedBinary_46_tmpxft_00004c15_00000000_6_TextureMain_cpp1_ii_texRef'
TextureFunc/libTextureFunc.a(TextureFunc_generated_TextureFunc.cu.o): In function `__sti____cudaRegisterAll_46_tmpxft_00004bd8_00000000_6_TextureFunc_cpp1_ii_421ca072':
/tmp/tmpxft_00004bd8_00000000-3_TextureFunc.cudafe1.stub.c:8: undefined reference to `__cudaRegisterLinkedBinary_46_tmpxft_00004bd8_00000000_6_TextureFunc_cpp1_ii_421ca072'
collect2: ld returned 1 exit status
make[2]: *** [src/TextureMain] Error 1
make[1]: *** [src/CMakeFiles/TextureMain.dir/all] Error 2

これは明らかにリンクエラーであり、おそらくcmakeを使用してコードをコンパイルする方法に関係しています。同じフラグのMakefileを使用してこのプロジェクトをコンパイルできたので、nvccのフラグは正しいと思います。しかし、他に何が間違っているのかよくわかりません。エラーメッセージが存在しない.cppファイルを参照していることに気づきましたが、それをどうすればよいかわかりません。

何かアドバイスをいただければ幸いです。私はcmakeバージョン2.8.8を使用しています。

4

1 に答える 1

5

${CUDA_LIBRARIES}` .cuファイルを使用して任意のターゲットにリンクするのはどうですか?

たとえば、src ディレクトリで次のように試すことができます。

cuda_add_executable(TextureMain TextureMain.cu)
target_link_libraries(TextureMain TextureFunc ${CUDA_LIBRARIES})
install(TARGETS TextureMain DESTINATION bin)
于 2014-09-06T00:09:03.243 に答える