我如何 "tell" CMake 3.9+ 我想使用 NVIDIA 的 OpenCL 库?
How can I "tell" CMake 3.9+ I want to use NVIDIA's OpenCL library?
在我的 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
在我的 CMakeCache.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
和 link 到 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,那么您可以使用 <Pkg>_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)
在我的 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
在我的 CMakeCache.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
和 link 到 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,那么您可以使用 <Pkg>_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)