交叉编译时NO_CMAKE_FIND_ROOT_PATH递归查找未生效的问题求助
交叉编译时从主机环境查找LibXslt的解决方案
你确实没完全用对NO_CMAKE_FIND_ROOT_PATH——这个选项仅对当前find_package调用生效,但LibXslt的CMake配置文件内部会递归调用find_package(Gcrypt),而这个内部调用并没有继承NO_CMAKE_FIND_ROOT_PATH,所以依然会遵循工具链的CMAKE_FIND_ROOT_PATH规则,只在mingw路径搜索。
以下是几个可行的解决方法:
方法一:临时修改全局查找模式
通过临时调整CMAKE_FIND_ROOT_PATH_MODE_*变量,让LibXslt及其依赖的查找同时覆盖主机和目标环境,完成后再恢复原有设置:
# 保存当前查找模式的初始值 set(ORIG_INC_MODE ${CMAKE_FIND_ROOT_PATH_MODE_INCLUDE}) set(ORIG_LIB_MODE ${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}) # 设置为同时搜索主机路径和目标根路径(BOTH),或直接跳过目标根路径(NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) # 查找主机环境的LibXslt find_package(LibXslt REQUIRED) # 恢复原有查找模式,避免影响后续目标依赖的查找 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ${ORIG_INC_MODE}) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ${ORIG_LIB_MODE})
方法二:手动指定主机路径
直接给LibXslt和Gcrypt的find_package指定主机上的实际安装路径,强制CMake从主机环境搜索:
# 查找主机的LibXslt,指定Arch上常见的cmake模块路径 find_package(LibXslt REQUIRED NO_CMAKE_FIND_ROOT_PATH PATHS /usr/lib/cmake/LibXslt /usr/share/cmake/Modules) # 手动指定主机Gcrypt的cmake模块路径 find_package(Gcrypt REQUIRED NO_CMAKE_FIND_ROOT_PATH PATHS /usr/lib/cmake/Gcrypt)
前置检查
确保Arch主机上已经安装了LibXslt和Gcrypt的开发包:
sudo pacman -S libxslt libgcrypt
内容的提问来源于stack exchange,提问作者DBear
相关产品推荐
相关产品推荐

