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

6

我使用了一个list来存储库的名称,我想使用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)

1
我找到了解决这个问题的方法,UNSET(FOUND_LIB CACHE) 起作用了。 - just_rookie
1
最好为每个库使用不同的变量名称。 - arrowd
1个回答

8

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实现尝试读取变量的缓存值时,它实际上读取了同名的普通变量的值。

由于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 时将不会再搜索相同的库。此外,这种方法允许用户修改缓存中特定库的路径而不影响其他库。


1
+1 建议为每个变量使用不同的名称 FOUND_LIB_${LIB},这样可以让循环正常运行并使缓存起作用。 - Steve Lorimer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接