如何使用cmake工具构建包含opencl(类c++)和cuda代码的可执行项目

这是一个实践中遇到的问题,关于cmake,涉及opencl和cuda。

我想实现利用cmake构建一个项目,含有opencl和cuda两部分代码。

但是我最后实现的只有opencl部分,cuda部分没有出来。

我通过自己的调试,基本可以排除opencl和cuda代码的问题,opencl代码和cuda代码都单独运行过,正常。应该是cmakelists的问题。但我无法解决,请求帮助,谢谢。

这是tree,其中 main.cpp是opencl代码部分,我是把cuda功能封装,然后在编译opencl是调用cuda模块

功能。

下面是两个CMakeLists

这是编译cuda部分的CMakeLists,即内层。

# CMakeLists.txt for G4CU project

project(gpu)

# required cmake version
cmake_minimum_required(VERSION 2.8)


# packages
find_package(CUDA)

#include_directories ("${PROJECT_SOURCE_DIR}")

# nvcc flags -g for debug
#set(CUDA_NVCC_FLAGS -O3;-G;-g)

#set(CUDA_NVCC_FLAGS -gencode arch=compute_20,code=sm_20;-G;-g)
#set(CUDA_NVCC_FLAGS -gencode arch=compute_52,code=sm_52;-G;-g)

file(GLOB_RECURSE CURRENT_HEADERS  *.h *.hpp *.cuh)
file(GLOB CURRENT_SOURCES  *.cpp *.cu)

source_group("Include" FILES ${CURRENT_HEADERS}) 
source_group("Source" FILES ${CURRENT_SOURCES}) 

cuda_add_library(gpu SHARED ${CURRENT_HEADERS} ${CURRENT_SOURCES})
#cuda_add_library(gpu STATIC ${CURRENT_HEADERS} ${CURRENT_SOURCES})

这是外层CMakeLists,即编译opencl部分,并调用内层编译过的cuda模块,的CMakeLists。

# CMakeLists.txt for G4CU project

project(project)

# required cmake version
cmake_minimum_required(VERSION 2.8)


add_subdirectory(cuda)
set (EXTRA_LIBS ${EXTRA_LIBS} gpu)


ADD_EXECUTABLE(project main.cpp )


target_link_libraries(project  ${EXTRA_LIBS}  /usr/local/cuda/lib64/libOpenCL.so )

这里有所有相关文件链接,文件夹中文件按照tree来的。

链接:https://pan.baidu.com/s/1hByjrzjROHbIxAdtAxeJIg 
提取码:nr1c 
 

我是参考了别人使用cmake混合编译普通c++和cuda的方法,因为opencl是c++的拓展,所以我额外引用了opencl库,这体现在外层的CMakeLists中,可能是这里出了问题。望指教!

在中.vscode/seetings.json,使用数组语法代替指定多个选项。例如,

{
    "cmake.sourceDirectory": "${workspaceFolder}/llvm",
    "cmake.configureSettings": {
        //...
        "LLVM_TARGETS_TO_BUILD" : ["X86", "NVPTX", "AMDGPU"],
        //...
    }
}

单一项目可以包含两个以上的库.

其难点在于如何编写CMakeLists.txt文件

其它可以在配置文件里修改