2013-03-22 1 views
5

지금은 Cuda 5의 객체 연결 기능을 사용하는 프로젝트에서 작업 중입니다. 프로젝트가 복잡해지기 때문에 cmake를 사용하여 코드를 컴파일하려고합니다. 그러나 나는 나를 위해 제대로 작동하려면 개체 연결을 얻을 수 없습니다.Cuda 객체 사용 Cmake와의 링크

원래 프로젝트와 동일한 종류의 오류를 가져 오는 장난감 버전의 프로젝트를 만들었습니다. 장난감 프로젝트는 GPU에서 실행되는 커널 함수를 호출하는 주 파일 (TextureMain.cu)로 구성됩니다. 각 GPU 스레드에서 사용자 정의 클래스 (TextureFunc)의 인스턴스가 참조되며 클래스는 주 파일과는 별도의 폴더에 있습니다. 클래스는 해당 폴더에있는 TextureFunc.cu 및 TextureFunc.h 파일로 구성됩니다. 여기

가 CMakeList.txt의 내가 사용하고있는 파일입니다 : 프로젝트 디렉토리에서

(포함 src 디렉토리) : 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) 

(포함 TextureMain.cu 및 TextureFunc 디렉토리) : TextureFunc 디렉토리에서

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

은 (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을 사용하고 있습니다.

+0

내가 CUDA에 대해 잘 모르겠지만, 나는 CUDA_NVCC_FLAGS에'-lcudadevrt'를 참조하십시오

은 src 디렉토리에 예를 들어, 당신은 시도 할 수 있습니다. 그것이 필요한 유일한 라이브러리입니까? 링커 명령 행에 적용되는 것을 보지 못했지만 그 부분은 생략 될 수 있습니다. – metal

+0

@metal 예, 그 깃발은 제거 될 수 있습니다. 이전에 비슷한 문제를 연결 한 객체를 검색하는 데 시간을 보냈으며 해당 플래그를 추가하는 것이 좋습니다. 깃발은 실제로 전혀 도움이되지 않았습니다. 어쨌든 나는 아마 그것을 제거해야합니다. –

+0

음, 분명히 CUDA 라이브러리가 누락 된 것 같습니다 (또는 잘못된 버전이 있습니까?). 적절한 커맨드 라인 옵션이 무엇인지 직접 확인하고 CMake가 사용하는 것과 비교해 볼 수 있습니까? – metal

답변

4

${CUDA_LIBRARIES}을 '.cu 개의 파일을 사용하는 대상에 연결하는 방법은 어떻습니까?

cuda_add_executable(TextureMain TextureMain.cu) 
target_link_libraries(TextureMain TextureFunc ${CUDA_LIBRARIES}) 
install(TARGETS TextureMain DESTINATION bin)