gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:06:13 25 4
gpt4 key购买 nike

我用了 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)

最佳答案

命令 find_library缓存 可变但简单的命令形式 unset仅删除 简单 变量的定义。

正如您提供的链接所指出的,您需要存储特殊值 FOUND_LIB-NOTFOUND到变量 FOUND_LIBfind_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 call会分开存放,下次调用cmake时不会再搜索同一个库。此外,这种方法允许用户修改(在缓存中)具体库的路径而不影响其他库。

关于CMake 使用 foreach 和 find_library 返回库的完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com