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

时间:2016-04-21 01:08:40

标签: cmake

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

1 个答案:

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