如何“告诉” CMake 3.9+ 我想使用 NVIDIA 的 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+,那么您根本不应该找到 package testservlet; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; /** * Servlet implementation class HelloServlet */ @WebServlet("/HelloServlet") public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * Default constructor. */ public HelloServlet() { // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request,HttpServletResponse response) */ protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.getWriter().println("<p>Hello Servlet</p>"); // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request,HttpServletResponse response) */ protected void doPost(HttpServletRequest request,IOException { // TODO Auto-generated method stub doGet(request,response); } } 。您只需使用 OpenCLFindCUDAToolkit 目标:

CUDA::OpenCL

如果您使用的是 CMake 3.16,那么您仍然可以使用 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) 并使用包变量链接到 CUDA 发现的 OpenCL:

FindCUDA

如果您早在 3.12,那么您可以使用 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}) 变量来指导搜索:

<Pkg>_ROOT

我希望找到合适的 OpenCL 版本。


但在早期版本中,您能做的最好的事情是使用 CUDA 根变量手动查找 CUDA 安装中的 OpenCL。然后,让 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) 创建导入的目标:

FindOpenCL