我使用 alist
来存储库的名称,我想使用foreach
并find_library
找到每个库的完整路径。但find_library
只是返回了第一个库的路径。我检查了这个帖子,但问题仍然存在。我的 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)
Run Code Online (Sandbox Code Playgroud)
命令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)
Run Code Online (Sandbox Code Playgroud)
实际上,这是一种技巧,因为缓存的变量FOUND_LIB
不会被简单的set
命令改变。但是当find_library
实现尝试读取变量的缓存值时,它实际上读取了同名简单变量的值。
因为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)
Run Code Online (Sandbox Code Playgroud)
这样每次find_library
调用的结果都会单独存储,下次调用cmake时不会再搜索同一个库。此外,这种方法允许用户修改(在缓存中)具体库的路径而不影响其他库。
归档时间: |
|
查看次数: |
2867 次 |
最近记录: |