CMake 使用 foreach 和 find_library 返回库的完整路径

jus*_*kie 5 cmake

我使用 alist来存储库的名称,我想使用foreachfind_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)

Tsy*_*rev 7

命令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时不会再搜索同一个库。此外,这种方法允许用户修改(在缓存中)具体库的路径而不影响其他库。