CMake OpenCL:无法读取内核文件

CMake OpenCL: can't read kernel file

我正在尝试加载外部 OpenCL 内核和 clCreateKernel returns 错误代码:-46 CL_INVALID_KERNEL_NAME。文件结构如下:

.
├── CMakeLists.txt
└── src
    ├── cl.hpp
    ├── GameOfLife.cpp
    └── kernels
        └── programs.cl

这是我的第一个 CMake 项目,因此我不确定以下 CMake 是否正确:

cmake_minimum_required(VERSION 3.5)
project(gpgpu_gameoflife)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lOpenCL")

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/src/kernels)

# source: http://igorbarbosa.com/articles/how-to-use-opengl-freeglut-and-cmake/
#########################################################
# FIND GLUT
#########################################################
find_package(GLUT REQUIRED)
include_directories(${GLUT_INCLUDE_DIRS})
link_directories(${GLUT_LIBRARY_DIRS})
add_definitions(${GLUT_DEFINITIONS})
if(NOT GLUT_FOUND)
    message(ERROR " GLUT not found!")
endif(NOT GLUT_FOUND)
#########################################################
# FIND OPENGL
#########################################################
find_package(OpenGL REQUIRED)
include_directories(${OpenGL_INCLUDE_DIRS})
link_directories(${OpenGL_LIBRARY_DIRS})
add_definitions(${OpenGL_DEFINITIONS})
if(NOT OPENGL_FOUND)
    message(ERROR " OPENGL not found!")
endif(NOT OPENGL_FOUND)


set(SOURCE_FILES
        src/GameOfLife.cpp
        src/kernels/programs.cl
        )
add_executable(gpgpu_gameoflife ${SOURCE_FILES})

target_link_libraries(gpgpu_gameoflife ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})

对于以下函数调用,我得到一个空字符串,因此我认为内核文件不可读取(内核本身不为空)。

std::string sourceCode = fileToString("kernels/programs.cl");

...

std::string fileToString(const std::string &path) {
    std::ifstream file(path, std::ios::in | std::ios::binary);
    if (file) {
        std::ostringstream contents;
        contents << file.rdbuf();
        file.close();
        return (contents.str());
    }
    return "";
}

能否请您告诉我如何使用加载外部内核的 CMake 创建 OpenCL 应用程序?或者这不是一个好的做法?

谢谢!

尽管 CMake 中的以下行解决了我的问题,但我仍在等待其他可能包含更好解决方案的答案。

configure_file(src/kernels/programs.cl kernels/programs.cl COPYONLY)