CMake在定义之前设置变量,在定义之后访问它们

时间:2018-04-28 17:19:26

标签: cmake

是否可以在定义之前设置一堆变量,例如,当使用CUDA并且我写

SET(MY_CUDA_LIBS CUDA_CUBLAS_LIBRARIES CUDA_CUFFT_LIBRARIES),

这样当

定义时
FIND_PACKAGE(CUDA REQUIRED)

现在可以访问CUDA_CUBLAS_LIBRARIESCUDA_CUFFT_LIBRARIES,即${CUDA_CUBLAS_LIBRARIES}${CUDA_CUFFT_LIBRARIES}是相应库的路径),我可以访问类似{{1}的内容它返回${MY_CUDA_LIBS}

如果我这样做,这显然有效。仅使用${CUDA_CUBLAS_LIBRARIES} ${CUDA_CUFFT_LIBRARIES}并执行CUDA_CUBLAS_LIBRARIES,但只要有一个库有多个库,这个技巧就不再起作用了,它返回CUDA_CUBLAS_LIBRARIESCUDA_CUFFT_LIBRARIES或“没有”。

我的想法是在${${MY_CUDA_LIBS}}的最开始定义CUDA库,然后它(远)稍后在CMakeLists.txt中访问时自动插入相应的路径。

1 个答案:

答案 0 :(得分:0)

从技术上讲,您应该将MY_CUDA_LIBS视为列表。然后,以下是可能的:

set(MANY_LIBS LIB_1 LIB_2)
set(LIB_1 "/libs/lib1")
set(LIB_2 "/libs/lib2")
list(GET MANY_LIBS 0 PATH)
message(${${PATH}})
list(GET MANY_LIBS 1 PATH)
message(${${PATH}})

产生预测的以下输出:

/libs/lib1
/libs/lib2

如果您希望稍后在TARGET_LINK_LIBRARIES中使用它,您可以在正确定义变量后执行以下操作:

foreach(libname ${MANY_LIBS})
    list(APPEND MANY_LIBS_PATHS ${${libname}})
endforeach(${MANY_LIBS_PATHS})
message("${MANY_LIBS_PATHS}")

之后,MANY_LIBS_PATHS可用于链接。