STM32MP157交叉编译时如何强制find_program忽略CMAKE_SYSROOT仅搜索指定路径
你遇到的问题核心是CMAKE_SYSROOT的路径拼接逻辑优先级高于NO_DEFAULT_PATH参数:当你提前设置了CMAKE_SYSROOT后,CMake 交叉编译模式下默认会给find_program指定的所有搜索路径自动拼接上sysroot前缀,相当于你传入的${OSTL_HOST_TOOLS}/usr/bin实际被处理成了${OSTL_TARGET_SYSROOT}/${OSTL_HOST_TOOLS}/usr/bin,自然会匹配到目标sysroot下的文件。而NO_DEFAULT_PATH仅用于禁用CMake默认的全局系统搜索路径,不会关闭sysroot前缀拼接逻辑,所以才会失效。
解决方案1:全局配置交叉编译搜索规则(推荐,适合工具链文件全局生效)
在工具链文件开头添加搜索规则控制变量,明确find_program搜索宿主机工具时不拼接sysroot:
# 声明当前为交叉编译模式 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) # 控制find_program不使用sysroot拼接,仅搜索给定的宿主机路径 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 库和头文件仍然走sysroot搜索 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
添加上述配置后你原来的find_program逻辑不需要修改,就能正确定位到${OSTL_HOST_TOOLS}/usr/bin下的工具。
解决方案2:单次find_program禁用sysroot拼接
如果不想修改全局规则,可以在find_program时额外添加NO_CMAKE_FIND_ROOT_PATH参数,直接关闭当前调用的sysroot前缀拼接逻辑:
find_program(CMAKE_AR NAMES ${STM32_TARGET_TRIPLET}-ar PATHS ${CMAKE_PROGRAM_PATH} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH )
解决方案3:调整配置顺序(你当前的临时方案也可长期使用)
CMAKE_SYSROOT的前缀拼接逻辑仅对设置后调用的find_*类指令生效,将所有搜索宿主机工具的find_program逻辑放在set(CMAKE_SYSROOT)之前执行,也可以避免路径拼接问题。
内容的提问来源于stack exchange,提问作者Daniyal Yasin
相关产品推荐
相关产品推荐

