Nvidia Pegasus aarch64交叉编译配置失败求助
解决Nvidia Pegasus aarch64交叉编译Bazel依赖声明错误
这个问题我之前帮人排查过,核心是Bazel的严格依赖检查机制没识别到你交叉编译工具链里的系统头文件属于内置依赖,反而把它们当成了需要显式声明的普通文件。下面给你几个针对性的解决办法,按优先级从高到低来:
1. 修复Bazel交叉工具链的cxx_builtin_include_directories配置
这是最根本的解决方式,直接告诉Bazel哪些路径是交叉编译工具链的系统头目录,不需要检查依赖。你需要找到你的aarch64工具链配置文件(一般是toolchain/BUILD或者类似路径),在cc_toolchain规则里添加对应的路径:
cc_toolchain( name = "aarch64-linux-gnu-toolchain", # 保留其他已有配置(比如工具路径、sysroot等) cxx_builtin_include_directories = [ "/home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include", "/home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1", "/home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/aarch64-linux-gnu", # 把错误提示里所有涉及的系统头目录都加进来 ], builtin_sysroot = "/home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc", )
配置完成后,重新运行Bazel构建,它就会自动忽略这些系统头文件的依赖检查。
2. 确保编译器参数用-isystem而非-I包含系统头目录
从你提供的编译命令来看,已经用了-isystem external/nvidia_pdk2,但没把交叉工具链自身的系统头目录加进去。你可以修改toolchain/gcc.sh脚本,在调用编译器时添加这些路径的-isystem参数:
# 在gcc.sh脚本中添加额外的系统头目录参数 EXTRA_FLAGS="-isystem /home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include \ -isystem /home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1 \ -isystem /home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/aarch64-linux-gnu" # 将额外参数拼接到编译命令中 $CC $EXTRA_FLAGS "$@"
Bazel会把-isystem标记的目录视为系统头文件路径,不会要求显式声明依赖。
3. 临时给目标添加copts参数(应急方案)
如果暂时不想修改工具链配置,可以直接在experimentals/examples/gflags/BUILD的cc_binary规则里添加copts,把这些系统头目录用-isystem包含:
cc_binary( name = "example", srcs = ["example.cc"], copts = [ "-isystem /home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include", "-isystem /home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1", "-isystem /home/liangzou/nvidia/nvidia_sdk/DRIVE_Software_10.0_Linux_OS_DDPX/DRIVEOS/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/aarch64-linux-gnu", ], deps = [...], # 保留原有依赖配置 )
这个方法能快速解决单个目标的问题,但如果有多个目标需要编译,还是建议从工具链层面彻底修复。
内容的提问来源于stack exchange,提问作者Liang Zou




