Cmake + CUDA + OpenCV

5

我有一个使用OpenCV的C++项目正在运行。 我正在创建一个CMakeLists.txt文件来帮助人们编译它,一切都很顺利。

简而言之:我如何使用CMake创建一个makefile,将“ .cu”文件编译为“ .o”,并使用NVCC将其链接到其他“.o”文件?

更详细的说明: 我想添加一个必须使用NVCC编译的CUDA文件。 我设法手动编译它,但是我不知道如何使用CMake创建一个可以这样做的makefile:

  • 如果已安装CUDA工具包,请让NVCC将我的“.cu”文件编译为“.o”文件,在CMake中进行
  • 使用此“.o”文件与由g++创建的其他文件
  • 不要使用NVCC编译所有项目(如果没有CUDA支持,则仍然可以编译我的项目)

目前,我的内容大致如下:

IF(CUDA_FOUND)
    MESSAGE( STATUS "I found CUDA !" )
    SET(HAVE_CUDA ${CUDA_FOUND} CACHE BOOL "Set to TRUE if CUDA is found, FALSE otherwise")
    cuda_compile(CudaKernel CudaKernels.cu)
ENDIF(CUDA_FOUND)

这将创建一个 .o 文件,但我不知道在哪里/如何使用它。 然后,我计划添加一个标志,例如:
if(HAVE_CUDA)
    set (CMAKE_CXX_FLAGS "-DGPU_OPENCV_ENABLE=1")
endif(HAVE_CUDA)

我应该如何在我的C++代码中使用宏来检测标志并调用正确的函数呢?

有什么想法吗?


1
你的实际问题是什么?你的方法有效吗?如果无效,出现了哪些错误? - m.s.
我列出了我无法完成的步骤。我想创建cmake文件,以自动创建一个好的makefile。 - Xavier Martinez
一个解决方案可能是创建一个库并将其链接到我的可执行文件中(像这样:http://www.eattardo.com/cmake-and-cuda-library/),但我没有找到我的问题的答案。 - Xavier Martinez
1个回答

2

好的,我想到了:

我们可以使用Cmake为cuda部分创建一个目标文件,并在编译结束时将其链接到cpp可执行文件中。

cmake_minimum_required(VERSION 2.8)
find_package(CUDA REQUIRED)
IF(CUDA_FOUND)
    SET(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-O3 -gencode arch=compute_20,code=sm_20)
    cuda_compile(CudaKernel CudaKernels.cu)
    cuda_add_library(CudaKernels CudaKernels.cu)
    add_definitions(-DGPU_OPENCV_ENABLE)
ENDIF()

在 CMake 的 C++ 部分中:
target_link_libraries(Executablename
                      CudaKernels
                      libraries...)

希望对某些人有所帮助!

我认为cuda_compile这一行不是必要的。同样的事情应该在cuda_add_library内部完成。 - kalj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接