java - Raspberry Pi 4 的引导 Bazel 失败,未找到 jni_md.h

标签 java gcc raspberry-pi bazel

我目前正在尝试在安装了 Raspbian Buster 的 headless Raspberry Pi 4 上从源代码编译最新版本的 Bazel (2.2.0)。我正在使用 this page作为安装指南。

按照该页面上的说明(安装所有依赖项、安装 Java 8、更改交换大小等),直到开始编译为止,我没有遇到任何问题。构建失败并出现以下错误:

ERROR: /home/pi/bazel/src/main/java/com/google/devtools/build/lib/syntax/BUILD:150:1: C++ compilation of rule '//src/main/java/com/google/devtools/build/lib/syntax:libcpu_profiler.so' failed (Exit 1): gcc failed: error executing command
  (cd /tmp/bazel_hpBqNseU/out/execroot/io_bazel && \
  exec env - \
    PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games \
    PWD=/proc/self/cwd \
  /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -g0 -O2 '-D_FORTIFY_SOURCE=1' -DNDEBUG -ffunction-sections -fdata-sections '-std=c++0x' -MD -MF bazel-out/arm-opt/bin/src/main/java/com/google/devtools/build/lib/syntax/_objs/libcpu_profiler.so/cpu_profiler_unimpl.pic.d '-frandom-seed=bazel-out/arm-opt/bin/src/main/java/com/google/devtools/build/lib/syntax/_objs/libcpu_profiler.so/cpu_profiler_unimpl.pic.o' -fPIC -iquote . -iquote bazel-out/arm-opt/bin -iquote external/bazel_tools -iquote bazel-out/arm-opt/bin/external/bazel_tools -isystem external/bazel_tools/tools/jdk/include -isystem bazel-out/arm-opt/bin/external/bazel_tools/tools/jdk/include -fno-canonical-system-headers -Wno-builtin-macro-redefined '-D__DATE__="redacted"' '-D__TIMESTAMP__="redacted"' '-D__TIME__="redacted"' -c src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_unimpl.cc -o bazel-out/arm-opt/bin/src/main/java/com/google/devtools/build/lib/syntax/_objs/libcpu_profiler.so/cpu_profiler_unimpl.pic.o)
Execution platform: //:default_host_platform
In file included from src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_unimpl.cc:17:
bazel-out/arm-opt/bin/external/bazel_tools/toolsls/jdk/include/jni.h:45:10: fatal error: jni_md.h: No such file or directory
 #include "jni_md.h"
          ^~~~~~~~~~
compilation terminated.

但是,运行 find/-name jni_md.h 2>/dev/null 返回

/usr/lib/jvm/java-8-openjdk-armhf/include/linux/jni_md.h

所以这并不是说我的系统中缺少头文件。

通过在线查找( this question specifically ),我显然需要为 gcc 添加一个附加参数,以便它可以看到该文件?但是,我不确定在哪里可以找到需要编辑的特定构建文件。

如果有人可以帮助我指出正确的方向,或者如果有其他解决方案可以修复此错误,我将不胜感激。

最佳答案

问题的“简单”第一部分

根据您链接到的另一个问题以及系统上文件 jni_md.h 的位置,以下是您需要添加到 gcc 命令中的“include”命令选项:

gcc -I/usr/lib/jvm/java-8-openjdk-armhf/include/linux

更棘手的第二部分

您问题的第二部分是如何修改 Bazel 的构建配置,以便进行适当的包含。需要在许多目标平台上编译的大型项目依赖于复杂的配置文件,其中指定了特定于平台的文件/编译器的路径。一开始可能会让人不知所措和困惑。

<强>1。问题出在哪里?

从你的错误来看,我看起来错误来自文件 /home/pi/bazel/src/main/java/com/google/devtools/build/lib/syntax/BUILD:150:1

下面是 excerpt taken from GitHub :

构建脚本的这一部分根据架构目标平台(windows/freebsd ...)显示各种配置,因为根据平台的不同,文件 jni_md.h 的位置会有所不同。

# The C++ portion of the Starlark CPU profiler.
cc_binary(
    name = "libcpu_profiler.so",
    srcs = select({
        "//src/conditions:darwin": ["cpu_profiler_posix.cc"],
        "//src/conditions:linux_x86_64": ["cpu_profiler_posix.cc"],
        "//conditions:default": ["cpu_profiler_unimpl.cc"],
    }),
    linkshared = 1,
    deps = [":jni"],
)

# TODO(adonovan): move this to @bazel_tools//tools/jdk:jni where it belongs.
# TODO(adonovan): why is there no condition for "just linux"?
cc_library(
    name = "jni",
    hdrs = ["@bazel_tools//tools/jdk:jni_header"] + select({
        "//src/conditions:linux_x86_64": ["@bazel_tools//tools/jdk:jni_md_header-linux"],
        "//src/conditions:darwin": ["@bazel_tools//tools/jdk:jni_md_header-darwin"],
        "//src/conditions:freebsd": ["@bazel_tools//tools/jdk:jni_md_header-freebsd"],
        "//src/conditions:openbsd": ["@bazel_tools//tools/jdk:jni_md_header-openbsd"],
        "//src/conditions:windows": ["@bazel_tools//tools/jdk:jni_md_header-windows"],
        "//conditions:default": [],
    }),
    includes = ["../../../../../../../../../external/bazel_tools/tools/jdk/include"] + select({
        # Remove these crazy prefixes when we move this rule.
        "//src/conditions:linux_x86_64": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/linux"],
        "//src/conditions:darwin": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/darwin"],
        "//src/conditions:freebsd": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/freebsd"],
        "//src/conditions:openbsd": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/openbsd"],
        "//src/conditions:windows": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/win32"],
        "//conditions:default": [],
    }),
)

根据您的错误:

Execution platform: //:default_host_platform

看起来您正在以“默认”配置编译项目。如果我们查看 BUILD 文件,我们可以看到在默认配置下构建时不包含“cc_library”路径:

cc_library(
    name = "jni",
    hdrs = ["@bazel_tools//tools/jdk:jni_header"] + select({
    "//conditions:default": [], # IT IS EMPTY
    }),
    includes = ["../../../../../../../../../external/bazel_tools/tools/jdk/include"] + select({
    "//conditions:default": [], # ALSO EMPTY HERE
    }),
)

这解释了为什么未添加 jni_md.h 位置的路径以及为什么会出现编译错误。

<强>2。如何解决这个问题?

开发人员之间似乎进行了一些讨论,以将一个简单的“linux”案例添加到配置中。但是,您似乎是在“默认”配置下进行编译。这可能是您问题的根本原因,但我假设您使用此配置是有原因的。

由于您的系统看起来像是“linux 类型”,因此将“linux 配置”添加到“默认”情况可能会解决您特定情况下的问题。

在 BUILD 文件中,尝试将 cc_library 部分更改为:

cc_library(
    name = "jni",
    hdrs = ["@bazel_tools//tools/jdk:jni_header"] + select({
    ...
    "//conditions:default": ["@bazel_tools//tools/jdk:jni_md_header-linux"],
    }),
    includes = ["../../../../../../../../../external/bazel_tools/tools/jdk/include"] + select({
    ...
    "//conditions:default": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/linux"],
    }),
)
<小时/>

这更像是一个“修补程序”,而不是永久解决方案。让我们知道它是否有效或者您是否收到其他错误!欢迎提出意见和其他建议。正如另一个答案中所建议的,使用旧版本的 Bazel 也可以解决该问题。

关于java - Raspberry Pi 4 的引导 Bazel 失败,未找到 jni_md.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60547881/

相关文章:

java - Collection.toArray() 方法,详细信息

python - 如何强制 pip 在 OSX 上使用 GCC?

raspberry-pi - 将数据包数据从 tshark 发送到wireshark

android - 无法 ping Android 设备

java - 仅运行特定功能,首先开始一些测试

java - Apache Spark 和 Spring Boot 的依赖冲突

c - 修复 WSL 上的 pthread_create 引用错误

python - Python音频功能无法正常工作

java - 如何在eclipse中以分层 View 创建包

c - 为什么用gcc和std=c99编译时找不到getaddrinfo