cmake 提供 CMAKE_PREFIX_PATH 作为参数不起作用?

问题描述 投票:0回答:1

我有这个简短的例子

CMakeLists.txt

cmake_minimum_required(VERSION 3.24)
project(test LANGUAGES CXX)
include(CheckLanguage)
check_language(CUDA)
if (CMAKE_CUDA_COMPILER)
        message("found")
else()
        message("not found")
endif()

现在我运行如下

cmake . --fresh -D CMAKE_PREFIX_PATH=/usr/local/cuda
-- The CXX compiler identification is GNU 13.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for a CUDA compiler
-- Looking for a CUDA compiler - NOTFOUND
not found
-- Configuring done (0.1s)
-- Generating done (0.0s)

我也可以在这里运行它,如下

export CMAKE_PREFIX_PATH=/usr/local/cuda
cmake . --fresh
-- The CXX compiler identification is GNU 13.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for a CUDA compiler
-- Looking for a CUDA compiler - /usr/local/cuda/bin/nvcc
found
-- Configuring done (2.0s)
-- Generating done (0.0s)

现在我很困惑。它仅在我设置了环境变量时才有效。我希望它能以两种方式工作,即通过环境变量或通过 cmake 参数设置

CMAKE_PREFIX_PATH

cmake
1个回答
0
投票

虽然 CMake 将

CMAKE_PREFIX_PATH
描述为 CMake 变量环境一,但它们是单独的变量:CMake 变量不会自动设置为环境一,反之亦然。

确实,这两个变量对

find_*
系列命令的影响方式相似。假设 CMake 使用 find_path 搜索编译器是合乎逻辑的。

但是,

check_language
函数在某种程度上是特定的:它实际上创建了一个新进程https://github.com/Kitware/CMake/blob/master/Modules/CheckLanguage.cmake#L118

在此过程中,CMake 尝试使用常规

project()
命令配置(新)项目,用于激活请求的语言。

环境变量会自动传递给新进程。但是,来自父进程的 CMake 变量不会自动传递给子进程。这正是您观察到的行为差异。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.