Cmake+CUDA+OpenCV

Xav*_*nez 5 c++ opencv cuda cmake

我有一个使用 OpenCV 的 C++ 项目。我正在创建一个 CMakeLists.txt 文件来帮助人们编译它,并且一切正常。

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

长版本:我想添加一个必须使用 NVCC 编译的 CUDA 文件。我设法手动编译它,但我不知道如何使用 CMake 创建 makefile 来执行此操作:

  • 如果在 CMake 中安装了 CUDA 工具包,则使 NVCC 将我的 .cu 文件编译为 .o 文件
  • 将此 .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)
Run Code Online (Sandbox Code Playgroud)

这会创建一个 .o 文件,但我不知道在哪里/如何使用它。

然后我计划添加一个标志,例如:

if(HAVE_CUDA)
    set (CMAKE_CXX_FLAGS "-DGPU_OPENCV_ENABLE=1")
endif(HAVE_CUDA)
Run Code Online (Sandbox Code Playgroud)

并在我的 C++ 代码中的宏中测试该标志以调用良好的函数。

任何想法?

Xav*_*nez 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()
Run Code Online (Sandbox Code Playgroud)

在 CMake 的 Cpp 部分中:

target_link_libraries(Executablename
                      CudaKernels
                      libraries...)
Run Code Online (Sandbox Code Playgroud)

希望它对某人有帮助!