gpt4 book ai didi

CMake - 强制 find_package 更新缓存变量

转载 作者:行者123 更新时间:2023-12-04 02:29:29 29 4
gpt4 key购买 nike

在我的 CMake 项目中,我提供了用户可编辑的 Boost 的默认路径。

set(PATH_BOOST_DEFAULT "/softs/boost/${BOOST_VER}/${ARCH}/gcc/${GCCVER}")
set(PATH_BOOST "${PATH_BOOST_DEFAULT}" CACHE PATH "Default path to Boost")

之后,我尝试使用以下命令查找库:
set(BOOST_ROOT "${PATH_BOOST}")
set(Boost_USE_MULTITHREAD ON)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost 1.53.0 REQUIRED COMPONENTS thread system)

这很好用,很多缓存变量,比如 Boost_INCLUDE_DIR , Boost_LIBRARY_DIRSBoost_THREAD_LIBRARY_DEBUG生成。

当我尝试修改缓存变量 PATH_BOOST 时,我的问题出现了: FindBoost.cmake生成的缓存变量没有更新。脚本 FindBoost.cmake似乎再次被调用(它打印有关找到的组件的消息)。我认为像 Boost_INCLUDE_DIR 这样的变量未更新,因为它们在缓存中。

有没有办法对 CMake 说“如果用户修改了路径,则通过强制缓存变量重新查找包”?

另外,是否有比以下丑陋的想法更好的方法来检测刚刚修改的缓存变量?
set(MY_VAR ${MY_VAR_DEFAULT} CACHE TYPE "")
if(NOT DEFINED MY_VAR_copy)
set(MY_VAR_copy ${MY_VAR} CACHE INTERNAL "")
mark_as_advanced(FORCE MY_VAR_copy)
endif()
if(NOT "${MY_VAR}" STREQUAL "${MY_VAR_copy}")
# my_var is modified : do something
set(MY_VAR_copy ${MY_VAR} CACHE INTERNAL "")
endif()

最佳答案

我想我和你有同样的问题。我的设置尝试查找包的特定版本:

set (MYPACK_REQUIRED_VERSION 1.2.3)
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT)

包配置脚本设置缓存变量 MYPACK_LIBRARIES然后在以后的阶段使用。但是,当我更改 MYPACK_REQUIRED_VERSION 时变量 cmake 仍然使用旧的 MYPACK_LIBRARIES而不是试图寻找新版本。

我想我现在已经通过取消设置这个缓存变量解决了这个问题:
set (MYPACK_REQUIRED_VERSION 1.2.3)
unset (MYPACK_LIBRARIES CACHE)
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT)

在我的情况下,这似乎再次触发了 find_package 过程。 find_package 有一些更精细的细节我不完全理解的程序,所以这可能不适用于您的情况,但可能值得一试。

关于CMake - 强制 find_package 更新缓存变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28365597/

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