cmake - 创建 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")
我在其他CMakeLists.txt中使用find_package(OpenCL):
...
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
您可以通过添加或调用选项来禁用搜索FindXXX.cmake
脚本:CONFIG
NO_MODULE
find_package
find_package(OpenCL 2 REQUIRED CONFIG)
对于某些包(例如 Boost),如果后一个脚本存在,它们的FindXXX.cmake
脚本会尝试“利用”其工作来编写脚本。XXXConfig.cmake
但是其他软件包(例如您使用的 OpenCL)不会这样做。我知道没有关于这种杠杆作用的协议。
推荐阅读
- python - 如何在 Python 代码中修改 HTML 代码?
- amazon-web-services - 带有标签条件的 AWS Secret IAM 策略无法通过 RDS 查询编辑器工作
- bash - 如何在 shell 脚本(sed/awk/etc)中删除多余的 www 子域?
- r - 使用 R 为 KNN 获得不同的结果
- ios - Swift:UICollectionView 中的单选按钮
- c++ - 了解 std::optional 在不同平台上的性能差异
- angular - Angular 7.2.15,由于后退导航,在导航(popstate)之后访问 RestoredState 数据
- javascript - webrtc udp协议规范格式webrtc udp转c#udp服务器解包收到的udp数据
- django - 如何在 Django 中测试 PasswordChangeView?
- c++ - cocos2d-x中精灵为什么会颤抖