“我怎么能?”;告诉;CMake 3.9+;我想使用NVIDIA';什么是OpenCL库?

“我怎么能?”;告诉;CMake 3.9+;我想使用NVIDIA';什么是OpenCL库?,cmake,build,cuda,opencl,Cmake,Build,Cuda,Opencl,在myCMakeLists.txt中,我有: cmake_minimum_required(VERSION 3.9) # ... etc etc ... find_package(CUDA 8.0 REQUIRED) find_package(OpenCL REQUIRED) 这发现了CUDA和OpenCL。但是-它更喜欢我的系统的非NVIDIA OpenCL库,而不是CUDA安装附带的库。事实上,比这更糟,因为我得到: //Path to a file. OpenCL_INCLUDE_DIR

在my
CMakeLists.txt
中,我有:

cmake_minimum_required(VERSION 3.9)
# ... etc etc ...
find_package(CUDA 8.0 REQUIRED)
find_package(OpenCL REQUIRED)
这发现了CUDA和OpenCL。但是-它更喜欢我的系统的非NVIDIA OpenCL库,而不是CUDA安装附带的库。事实上,比这更糟,因为我得到:

//Path to a file.
OpenCL_INCLUDE_DIR:PATH=/usr/local/cuda/include

//Path to a library.
OpenCL_LIBRARY:FILEPATH=/usr/lib/x86_64-linux-gnu/libOpenCL.so
在我的
cmakcache.txt
文件中

我如何从CMakeLists.txt内部(即不是作为用户而是作为包维护者)让CMake切换偏好顺序


注意:是的,出于兼容性的原因,它需要是CMake 3.9。

因为您使用的是CMake 3.9,所以您的双手非常束缚


如果您使用的是CMake 3.17+,那么您应该根本找不到
OpenCL
。您只需使用
FindCUDAToolkit
CUDA::OpenCL
目标:

cmake_minimum_required(VERSION 3.17)
project(test)

find_package(CUDAToolkit 8.0 REQUIRED)

add_executable(my_target ...)
target_link_libraries(my_target PRIVATE CUDA::OpenCL)

如果您使用的是CMake 3.16,那么您仍然可以使用
FindCUDA
并使用包变量链接到CUDA found OpenCL:

cmake_minimum_required(VERSION 3.16)
project(test)

find_package(CUDA 8.0 REQUIRED)

cuda_add_executable(my_target ...)
target_link_libraries(my_target PRIVATE ${CUDA_OpenCL_LIBRARY})

如果您早在3.12版本,则可以使用
\u ROOT
变量来指导搜索:

cmake_minimum_required(VERSION 3.12)
project(test)

find_package(CUDA 8.0 REQUIRED)

set(OpenCL_ROOT "${CUDA_TOOLKIT_ROOT_DIR}")
find_package(OpenCL REQUIRED)
我希望找到正确的OpenCL版本


但在早期版本中,最好使用CUDA根变量手动查找CUDA安装中的OpenCL。然后,让
FindOpenCL
创建导入的目标:

cmake_minimum_required(VERSION 3.9)
project(test)

find_package(CUDA 8.0 REQUIRED)

find_path(
  OpenCL_INCLUDE_DIR CL/opencl.h
  HINTS "${CUDA_TOOLKIT_ROOT_DIR}/include"
  NO_DEFAULT_PATH
)

if (CMAKE_SIZEOF_VOID_P EQUAL 8)
  set(opencl_lib64 "${CUDA_TOOLKIT_ROOT_DIR}/lib64" )
endif()

find_library(
  OpenCL_LIBRARY OpenCL
  HINTS ${opencl_lib64} "${CUDA_TOOLKIT_ROOT_DIR}/lib"
  PATH_SUFFIXES "${CMAKE_LIBRARY_ARCHITECTURE}"
  NO_DEFAULT_PATH
)

find_package(OpenCL REQUIRED)

cuda_add_executable(my_target ...)
target_link_libraries(my_target PRIVATE OpenCL::OpenCL)

因此,
find_path()
find_library()
将使
find_package()
调用的行为发生偏差?@einpoklum没错。这些find调用设置了FindOpenCL使用的两个缓存变量:“是的,出于兼容性的原因,它需要CMake 3.9。”-我们过去也这么说,直到重新实现长期存在于上游的行为的维护痛苦变得太大。现在我们在古老的ARM SOC上运行CMake 3.20。这是一个决定,不是一个决定requirement@AlexReinking:当你开发一个面向广大读者的库时,你无法决定人们将拥有什么版本的CMake…Ubuntu 18.04+上的CMake快照总是最新的,并且会自动更新。Ubuntu20.04的存储库中有3.16版本,Kitware为18.04+版本提供了一个始终是最新版本的APT repo。自制的总是最新的。VS2019经常更新,现在是3.19版本。所有的二进制版本都可以在没有admin/root的情况下安装,包括aarch64。谁是你的用户——大概是C++开发者——谁拒绝更新一个基本的工具?想必你的用户将不得不在他们的系统上安装CUDA来构建你的库。当他们等待CUDA下载时,他们可以安装CMake@AlexReinking当前位置显然,你是对的!