首次构建时忽略CMake变量(CUDA_NVCC_FLAGS)

时间:2019-05-04 08:20:07

标签: cmake cuda

在我的CMakeLists.txt中,我正在加载如下环境变量:

cmake_minimum_required(VERSION 2.6)

set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")

message("CUDA_NVCC_FLAGS = ${CUDA_NVCC_FLAGS}")

但是,在干净(rm -r build)之后的首次构建尝试中,它只会忽略CUDA_NVCC_FLAGS变量,从而导致构建失败:

cmake -D CMAKE_CXX_FLAGS="-g -O3 -fmax-errors=1" ../../

make -j8

控制台输出:

CUDA_NVCC_FLAGS =  -gencode arch=compute_61,code=sm_61 -lineinfo --default-stream per-thread --disable-warnings
...
/home/mad/workspace/automy-system/vision/src/DeBayerFilter.cu(132): warning: integer conversion resulted in truncation
/home/mad/workspace/automy-system/vision/src/HeightMapFilter.cu(115): error: identifier "__ldg" is undefined

构建失败,因为我的CUDA代码需要由CUDA_NVCC_FLAGS启用的特定计算功能。

第二次尝试,之后效果很好。

cmake version 3.5.1

1 个答案:

答案 0 :(得分:1)

与其他任何CMAKE_<LANG>_FLAGS变量一样,在检测到编译器时,会在CUDA_NVCC_FLAGS调用中设置project(CUDA)变量。因此,应在project调用之后执行附加到该变量的操作:

project(MyProject CUDA)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")

如果使用find_package(CUDA)检测到CUDA(在本机不支持CUDA的旧CMake版本中),则应在find_package(CUDA)之后附加标志,这将设置CUDA_NVCC_FLAGS变量:

find_package(CUDA REQUIRED)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")

反序起作用的原因(但仅在非第一配置中有效)是因为变量CUDA_NVCC_FLAGS实际上已被缓存:第一个project()调用设置了变量的值并将其存储到缓存中。进一步的project()调用会检测到编译器已被检查,因此不会重新设置变量。