创建CMake XXConfig.cmake让其他cmake项目调用 [英] Create CMake XXConfig.cmake let other cmake project invoke

查看:871
本文介绍了创建CMake XXConfig.cmake让其他cmake项目调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆