在我的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")
Run Code Online (Sandbox Code Playgroud)
在那之后,我尝试找到libs:
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)
Run Code Online (Sandbox Code Playgroud)
这工作得很好,并有很多缓存变量的喜欢Boost_INCLUDE_DIR,Boost_LIBRARY_DIRS或Boost_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()
Run Code Online (Sandbox Code Playgroud)
我想我和你有同样的问题。我的设置尝试查找包的特定版本:
set (MYPACK_REQUIRED_VERSION 1.2.3)
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT)
Run Code Online (Sandbox Code Playgroud)
包配置脚本设置缓存变量,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)
Run Code Online (Sandbox Code Playgroud)
在我的例子中,这似乎再次触发 find_package 过程。该过程的一些细节find_package我不完全理解,因此这可能不适用于您的情况,但可能值得一试。
| 归档时间: |
|
| 查看次数: |
1839 次 |
| 最近记录: |