簡體   English   中英

C ++ / CUDA項目的Cmake文件

[英]Cmake file for C++/CUDA project

我在使用cmakemake編譯應用程序時遇到麻煩。 項目的源文件組織如下:

SOURCE/
  CMakeLists.txt
  myApp.cc
  include/
    classA.hh
    classB.hh
  src/
    classA.cc
    classB.cc
    classB.cu 

我的CMakeLists.txt文件如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(myApp)

FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})

FIND_PACKAGE(GDCM REQUIRED)
IF(GDCM_FOUND)
    INCLUDE(${GDCM_USE_FILE})
    SET(GDCM_LIBRARIES gdcmCommon vtkgdcm)
ELSE(GDCM_FOUND)
    MESSAGE(FATAL_ERROR "Cannot find GDCM, did you set GDCM_DIR?")
ENDIF(GDCM_FOUND)

SET(CUDA_TOOLKIT_ROOT_DIR="/Developer/NVIDIA/CUDA-7.5/")
FIND_PACKAGE(CUDA REQUIRED)
SET(CUDA_PROPAGATE_HOST_FLAGS ON)
SET(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -gencode arch=compute_30,code=sm_30)

SET(LIB_TYPE SHARED)
SET(CUDA_SEPARABLE_COMPILATION ON)

LINK_DIRECTORIES(/lib/FFTW/INSTALL/lib)
INCLUDE_DIRECTORIES(/lib/FFTW/INSTALL/include)

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

FILE(GLOB headers  ${PROJECT_SOURCE_DIR}/include/*.hh)
FILE(GLOB sources  ${PROJECT_SOURCE_DIR}/src/*.cc)
FILE(GLOB cudafile ${PROJECT_SOURCE_DIR}/src/*.cu)


CUDA_ADD_EXECUTABLE(myApp myApp ${headers} ${sources} ${cudafile})
TARGET_LINK_LIBRARIES(myApp ${VTK_LIBRARIES} ${GDCM_LIBRARIES} fftw3)

當我嘗試使用make編譯項目時(成功運行cmake之后),我得到:

nvcc fatal   : A single input file is required for a non-link phase when an outputfile is specified
CMake Error at myApp_generated_classB.cu.o.cmake:207 (message):
  Error generating
  ../BUILD/CMakeFiles/myApp.dir/src/./myApp_generated_classB.cu.o

將類的源文件分解為.cc和.cu文件是否有問題?

這不是對引起問題的確切原因的全面解釋; 但是,它以相當令人滿意的方式解決了該問題。

首先 ,顯然在使用FIND_PACKAGE(VTK) (以及因此FIND_PACKAGE(GDCM)似乎需要vtkgdcm需要VTK CMake文件 )和nvcc之間存在沖突。 最近在螳螂上報道 為了避免這種沖突,我使用:

LINK_DIRECTORIES(   {VTK_Directory}/INSTALL/lib)
INCLUDE_DIRECTORIES({VTK_Directory}/INSTALL/include/vtk-6.2)

LINK_DIRECTORIES(   {GDCM_Directory}/INSTALL/lib)
INCLUDE_DIRECTORIES({GDCM_Directory}/INSTALL/include/gdcm-2.4)

代替,

FIND_PACKAGE(VTK REQUIRED)
FIND_PACKAGE(GDCM REQUIRED)

其次 ,對於項目的CUDA部分,我將所有內容都放入一個.cu文件中,並使用CUDA_COMPILE(cuda_o myCUDAstudff.cu)創建一個目標文件。 然后,我使用本機C ++編譯器使用ADD_EXECUTABLE( ... ${cuda_o})照常創建可執行文件。 由於我使用的是本機C ++編譯器而不是nvcc,因此我需要在內核(myCUDAstudff.cu)文件中包含以下頭文件:

#include <cuda.h>
#include <cuda_runtime.h>

並鏈接到我使用共享庫的TARGET_LINK_LIBRARIES() libcudart 我無法找到一種與libcudart_static.a相同的方法。

或者,可以使用CUDA_ADD_EXECUTABLE(... myCUDAstudff.cu)代替上述所有步驟(即CUDA_COMPILE(),ADD_EXECUTABLE()等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM