通过参数传递CMAKE_PREFIX_PATH给CMake为何不生效?
为什么两种设置
CMAKE_PREFIX_PATH的方式效果不同? 核心原因是CMake对环境变量和命令行参数方式设置的CMAKE_PREFIX_PATH处理逻辑存在差异:
环境变量方式:当你通过
export CMAKE_PREFIX_PATH=/usr/local/cuda设置时,CMake会自动将该路径下的bin子目录(即/usr/local/cuda/bin)添加到CMAKE_PROGRAM_PATH中——这个变量是CMake专门用来查找可执行文件(包括编译器)的路径列表。check_language(CUDA)内部会调用find_program查找nvcc,自然能定位到该路径下的编译器。命令行参数方式:当你用
-D CMAKE_PREFIX_PATH=/usr/local/cuda设置时,CMake仅会将该路径作为包查找路径(用于查找CMake配置文件、库文件等),不会自动把其bin子目录加入到CMAKE_PROGRAM_PATH。如果你的系统PATH里没有/usr/local/cuda/bin,find_program就找不到nvcc,从而提示未找到CUDA编译器。
解决命令行参数方式的问题
有几种可行的方案:
- 直接指定CUDA编译器的绝对路径:
cmake . --fresh -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc - 同时设置
CMAKE_PROGRAM_PATH,手动添加编译器所在的bin目录:cmake . --fresh -DCMAKE_PREFIX_PATH=/usr/local/cuda -DCMAKE_PROGRAM_PATH=/usr/local/cuda/bin - 在CMakeLists.txt中手动将
CMAKE_PREFIX_PATH的bin子目录加入查找路径:cmake_minimum_required(VERSION 3.24) project(test LANGUAGES CXX) include(CheckLanguage) # 手动添加bin目录到可执行文件查找路径 list(APPEND CMAKE_PROGRAM_PATH "${CMAKE_PREFIX_PATH}/bin") check_language(CUDA) if (CMAKE_CUDA_COMPILER) message("found") else() message("not found") endif()
内容的提问来源于stack exchange,提问作者RainerMtb
相关产品推荐
相关产品推荐

