如何让CMake在工具链前缀无短横线时正确检测ar、nm等二进制工具
解决方案
方案1:强制指定工具链前缀(适配所有支持tiarmclang的CMake版本,无需逐个设置工具)
你可以在工具链文件的最开头(project指令执行之前)将_CMAKE_TOOLCHAIN_PREFIX设置为带FORCE属性的缓存变量,避开CMake内部正则匹配逻辑的覆盖:
set(_CMAKE_TOOLCHAIN_PREFIX "tiarm" CACHE INTERNAL "TI ARM Clang toolchain prefix" FORCE)
该方案的原理是:CMake内部的普通变量会在CMakeDetermineCCompiler模块执行时被重写,设置为带FORCE参数的INTERNAL缓存变量后,值会被强制保留,后续CMakeFindBinUtils模块会直接使用该前缀查找tiarmar、tiarmnm等对应工具,不需要额外配置。
方案2:显式指定每个二进制工具路径(兼容性最高,无版本依赖)
如果你当前使用的CMake版本对内部变量的覆盖逻辑有差异,方案1不生效,可以继续使用你当前的手动设置方案,直接在工具链文件中指定所有工具的路径,该方案不会受CMake版本迭代影响,稳定性最高:
# 请将<path_to_tiarmclang_bin>替换为你的tiarmclang二进制文件所在目录的绝对路径 set(CMAKE_AR "<path_to_tiarmclang_bin>/tiarmar" CACHE FILEPATH "Archiver" FORCE) set(CMAKE_NM "<path_to_tiarmclang_bin>/tiarmnm" CACHE FILEPATH "Symbol dumper" FORCE) set(CMAKE_READELF "<path_to_tiarmclang_bin>/tiarmreadelf" CACHE FILEPATH "ELF parser" FORCE) set(CMAKE_STRIP "<path_to_tiarmclang_bin>/tiarmstrip" CACHE FILEPATH "Symbol stripper" FORCE)
如果同时使用C++编译器,按照相同逻辑设置CMAKE_CXX_COMPILER_AR等对应变量即可。
注意事项
- 建议所有工具路径都使用绝对路径,避免CMake在系统PATH中匹配到其他版本的同名工具
- 如果TI编译器的bin目录已经加入系统PATH,也可以直接填写工具名,不需要写全路径
内容的提问来源于stack exchange,提问作者Arno Moonen
相关产品推荐
相关产品推荐

