Bazel交叉编译aarch64时找不到已存在的Scrt1.o文件该如何配置?
问题根因
你遇到的报错核心原因有两个:
- 仅给编译动作添加了
--sysroot参数,链接动作没有同步配置,且缺少gcc查找crt启动文件专用的-B参数 - Bazel沙箱默认隔离了工作区外的文件,/opt下的交叉工具链文件没有被声明为构建依赖,无法进入沙箱被链接器访问
具体修改方案
1. 修改cc_toolchain_config.bzl配置
第一步:补充链接器参数
在default_linker_flags的flags数组开头新增--sysroot和-B参数,其中-B的路径替换为你实际存放Scrt1.o/crti.o等文件的目录:
default_linker_flags = feature( name = "default_linker_flags", enabled = True, flag_sets = [ flag_set( actions = all_link_actions, flag_groups = ([ flag_group( flags = [ # 新增以下两行 "--sysroot=/opt/xcu-fsl-auto/1.0/sysroots/aarch64-fsl-linux", "-B/opt/xcu-fsl-auto/1.0/sysroots/aarch64-fsl-linux/usr/lib/aarch64-fsl-linux/10.2.0", # 原有参数保留 "-L/opt/xcu-fsl-auto/1.0/sysroots/aarch64-fsl-linux", "-L/opt/xcu-fsl-auto/1.0/sysroots/aarch64-fsl-linux/lib", "-L/opt/xcu-fsl-auto/1.0/sysroots/aarch64-fsl-linux/usr/lib", "-L/opt/xcu-fsl-auto/1.0/sysroots/aarch64-fsl-linux/usr/lib/aarch64-fsl-linux/10.2.0", ], ), ]), ), ], )
第二步:修正工具链元数据
将cc_common.create_cc_toolchain_config_info中标记为unknown的参数替换为实际值,避免Bazel架构识别错误:
return cc_common.create_cc_toolchain_config_info( ctx = ctx, cxx_builtin_include_directories = [ # 原有路径保留 "/opt/xcu-fsl-auto/1.0/sysroots/aarch64-fsl-linux/usr/include", "/opt/xcu-fsl-auto/1.0/sysroots/x86_64-fslbsp-linux/usr/lib/aarch64-fsl-linux/gcc/aarch64-fsl-linux/10.2.0", "/opt/xcu-fsl-auto/1.0/sysroots/x86_64-fslbsp-linux/usr/lib/aarch64-fsl-linux/gcc/aarch64-fsl-linux/10.2.0/include", ], features = features, toolchain_identifier = "s32g-toolchain", host_system_name = "x86_64-linux-gnu", # 替换以下unknown参数 target_system_name = "aarch64-linux-gnu", target_cpu = "aarch64", target_libc = "glibc", compiler = "gcc", abi_version = "aarch64", abi_libc_version = "glibc_2.31", # 可替换为你实际glibc版本,不影响编译的话也可以保留通用值 tool_paths = tool_paths, )
2. 声明工具链依赖让文件进入沙箱
方案A:生产环境推荐配置
在项目的WORKSPACE文件中添加本地仓库声明,将/opt下的工具链纳入Bazel的文件管理:
local_repository( name = "s32g_toolchain_sysroot", path = "/opt/xcu-fsl-auto/1.0", build_file_content = """ filegroup( name = "all_files", srcs = glob(["**"]), visibility = ["//visibility:public"], ) """, )
然后修改你的BUILD文件中的all文件组,引用外部工具链的文件:
filegroup( name = "all", srcs = glob(["**"]) + ["@s32g_toolchain_sysroot//:all_files"], )
方案B:临时测试快速验证
如果只是临时验证功能,可以在编译命令后添加参数禁用沙箱隔离,跳过文件声明步骤:
bazel build 你的目标 --spawn_strategy=standalone --sandbox_writable_path=/opt/xcu-fsl-auto
内容的提问来源于stack exchange,提问作者langyu
相关产品推荐
相关产品推荐

