You need to enable JavaScript to run this app. STM32MP157交叉编译时如何强制find_program忽略CMAKE_SYSROOT仅搜索指定路径
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 11:21:02