我使用list
来存储库的名称,我想使用foreach
和find_library
来查找每个库的完整路径。但是find_library
刚刚返回了第一个库的路径。我查了this post,但问题仍然存在。我的CMake版本是3.4.3。
SET(VTKLIBS_DIR)
FOREACH(LIB ${VTKLIBS})
SET(FOUND_LIB)
FIND_LIBRARY(FOUND_LIB ${LIB})
LIST(APPEND VTKLIBS_DIR ${FOUND_LIB})
MESSAGE("Lib: ${LIB}")
MESSAGE("Found Lib: ${FOUND_LIB}")
UNSET(FOUND_LIB)
ENDFOREACH(LIB)
答案 0 :(得分:4)
命令find_library
设置缓存变量,但简单形式的命令unset
仅删除简单变量的定义。
正如您提供的链接所述,您需要将特殊值 FOUND_LIB-NOTFOUND
存储到变量FOUND_LIB
,以便强制find_library
搜索另一个库,同时变量已包含上一个库的路径:
FOREACH(LIB ${VTKLIBS})
SET(FOUND_LIB "FOUND_LIB-NOTFOUND")
FIND_LIBRARY(FOUND_LIB ${LIB})
LIST(APPEND VTKLIBS_DIR ${FOUND_LIB})
MESSAGE("Lib: ${LIB}")
MESSAGE("Found Lib: ${FOUND_LIB}")
ENDFOREACH(LIB)
实际上,这是一种技巧,因为简单的FOUND_LIB
命令不会改变缓存变量set
。但是当find_library
实现尝试读取变量的缓存值时,它实际上读取了具有相同名称的 simple 变量的值。
由于find_library
仅将*-NOTFOUND
缓存值视为“未找到库”,因此为变量指定空值的技巧不起作用。
如@arrowd所述,更好的方法是使用不同的变量名称,用于不同的find_library()
调用:
FOREACH(LIB ${VTKLIBS})
FIND_LIBRARY(FOUND_LIB_${LIB} ${LIB})
LIST(APPEND VTKLIBS_DIR ${FOUND_LIB_${LIB}})
MESSAGE("Lib: ${LIB}")
MESSAGE("Found Lib: ${FOUND_LIB_${LIB}}")
ENDFOREACH(LIB)
这种方式导致每个find_library
调用将被单独存储,并且在下次调用cmake时不会再次搜索相同的库。此外,这种方法允许用户修改(在缓存中)具体库的路径,而不会影响其他库。