【问题标题】:Cmake file for C++/CUDA projectC++/CUDA 项目的 Cmake 文件
【发布时间】:2015-11-04 03:17:47
【问题描述】:

我在使用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 文件有问题吗?

【问题讨论】:

标签: c++ cuda cmake


【解决方案1】:

这不是对问题中所述问题的确切原因的全面解释;然而它以相当令人满意的方式解决了这个问题。

首先,显然在使用 FIND_PACKAGE(VTK)(因此 FIND_PACKAGE(GDCM) 似乎需要 VTK CMake 文件 for vtkgdcm)和 @ 之间存在冲突987654324@。这是最近的reported on Mantis。为了避免这种冲突,我使用:

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()、...)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2019-10-23
    • 1970-01-01
    • 2019-04-16
    • 2019-01-16
    • 2010-09-28
    • 2021-11-27
    相关资源
    最近更新 更多