创建 CMake XXConfig.cmake 让其他 cmake 项目调用



我从KhronosGroup下载opencl-icd并构建得很好。

但它没有OpenCLConfig.cmake。

所以我决定创建一个我的程序(CMakeLists.txt(可以使用find_package(OpenCL(来调用它。

以下文件树是我构建后的 OpenCL 目录。


# $PWD is C:/SDKs/ocl-icd
|-- OpenCLConfig.cmake
|-- bin
|   `-- OpenCL.dll
|-- include
|   `-- CL
... CL Headers
`-- lib
|-- OpenCL.exp
`-- OpenCL.lib

我创建了OpenCLConfig.cmake,内容是:

set(OpenCL_DIR "C:/SDKs/ocl-icd")
set(OpenCL_VERSION 2.2)
set(OpenCL_VERSION_MAJOR 2)
set(OpenCL_VERSION_MINOR 2)
SET(OpenCV_VERSION_PATCH 0)
SET(OpenCV_VERSION_TWEAK 0)
set(OpenCL_INCLUDE_DIR "${OpenCL_DIR}/include")
set(OpenCL_LIBRARIES "OpenCL")

我在其他人中使用find_package(OpenCL(CMakeLists.txt

...
set(OpenCL_DIR "C:/SDKs/ocl-icd" CACHE PATH "OpenCL Root DIR")
find_package(OpenCL 2 REQUIRED) 
include_directories (${OpenCL_INCLUDE_DIR})
add_executable (${PROJECT_NAME} test.cc)
target_link_libraries(${OpenCL_LIBRARIES})
...

当我使用 cmake-gui 来配置它时,我收到了错误报告

CMake Error at C:/Program Files/CMake/share/cmake-3.15/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
Could NOT find OpenCL (missing: OpenCL_INCLUDE_DIR) (Required is at least
version "2")
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.15/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
C:/Program Files/CMake/share/cmake-3.15/Modules/FindOpenCL.cmake:150 (find_package_handle_standard_args)
CMakeLists.txt:10 (find_package)

我认为这是由OpenCLConfig.cmake引起的错误。

我该如何解决?

更新:添加OpenCLConfigVersion.cmake

set(OpenCL_VERSION 2.2)
set(OpenCL_VERSION_MAJOR 2)
set(OpenCL_VERSION_MINOR 2)
SET(OpenCV_VERSION_PATCH 0)
SET(OpenCV_VERSION_TWEAK 0)

错误消息指出,错误是由 CMake 附带的脚本发出的:

C:/Program Files/CMake/share/cmake-3.15/Modules/FindOpenCL.cmake

并且您的脚本 (OpenCLConfig.cmake( 将被忽略

问题是,当find_package()在脚本中搜索处理请求时,首先搜索FindXXX.cmake脚本。仅当不存在此类脚本时,才会搜索XXXConfig.cmake脚本。

您可以通过向find_package调用添加CONFIGNO_MODULE选项来禁用FindXXX.cmake脚本搜索:

find_package(OpenCL 2 REQUIRED CONFIG)

对于某些软件包(例如 Boost(,如果后一个脚本存在,它们的FindXXX.cmake脚本会尝试"利用"其工作来XXXConfig.cmake脚本。但是其他软件包(如您使用的OpenCL(不会这样做。我不知道关于这种杠杆作用的协议。

最新更新