创建CMake XXConfig.cmake让其他cmake项目调用 [英] Create CMake XXConfig.cmake let other cmake project invoke
问题描述
我从KhronosGroup下载opencl-icd并构建良好。
I download opencl-icd from KhronosGroup and build it fine.
但是它没有OpenCLConfig.cmake。
But it doesn't have OpenCLConfig.cmake.
因此,我决定创建一个程序,使我的程序(CMakeLists.txt)可以使用 find_package(OpenCL)来调用它。
So I decide to create one that my program(CMakeLists.txt) can use find_package(OpenCL) to invoke it.
下面的文件树是我的OpenCL目录。在我构建之后。
Following file tree is my OpenCL dir. after I build.
# $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")
我在其他 CMakeLists.txt中使用 find_package(OpenCL) :
I use find_package(OpenCL) in others 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对其进行配置,但我得到了错误报告
While I use cmake-gui to configure it, I got error report
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
update: add 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附带的脚本发出的:
The error message says, that the error is emitted by the script shipped with CMake:
C:/Program Files/CMake/share/cmake-3.15/Modules/FindOpenCL.cmake
和您的脚本( OpenCLConfig.cmake
)被忽略。
问题是当 find_package()
搜索脚本以处理请求,首先搜索 FindXXX.cmake
脚本。仅当缺少此类脚本时,才搜索 XXXConfig.cmake
脚本。
The thing is that when find_package()
searches the script for process the request, FindXXX.cmake
script is searched first. Only if such script is absent, XXXConfig.cmake
script is searched.
您可以禁用搜索 FindXXX.cmake
脚本,方法是将 CONFIG
或 NO_MODULE
选项添加到 find_package
调用:
You may disable searching for FindXXX.cmake
script by adding CONFIG
or NO_MODULE
option to find_package
call:
find_package(OpenCL 2 REQUIRED CONFIG)
对于某些软件包(例如Boost),其 FindXXX。如果存在后者,cmake
脚本会尝试将其工作利用到 XXXConfig.cmake
脚本中。但是其他软件包(例如您使用的OpenCL)则无法做到这一点。我不知道在这种杠杆作用上达成任何协议。
For some packages (e.g. Boost) their FindXXX.cmake
script tries to "leverage" its work to XXXConfig.cmake
script, if the latter script exists. But other packages (like OpenCL which you use) do not do that. I know no agreements on this leveraging.
这篇关于创建CMake XXConfig.cmake让其他cmake项目调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!