需要使用Bazel+;交叉编译nsync的帮助吗;利纳罗

需要使用Bazel+;交叉编译nsync的帮助吗;利纳罗,bazel,Bazel,我试图使用Bazel进行交叉编译,并遇到与中描述的完全相同的错误,即: .///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory 发布该问题的人似乎与我是同一个人,但他们对根本原因得出了截然不同的结论(即,他们声称这是由于键入错误的包含路径导致的用户错误)。在我的例子中,所有路径都是正确的,但它们被nsync的构建忽略/覆盖。我真的需要一些帮助来弄清楚需要做哪些更改才能使用Linaro工

我试图使用Bazel进行交叉编译,并遇到与中描述的完全相同的错误,即:

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
发布该问题的人似乎与我是同一个人,但他们对根本原因得出了截然不同的结论(即,他们声称这是由于键入错误的包含路径导致的用户错误)。在我的例子中,所有路径都是正确的,但它们被nsync的构建忽略/覆盖。我真的需要一些帮助来弄清楚需要做哪些更改才能使用Linaro工具链正确构建nsync

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
下面是一个小脚本,它在我的系统上100%的时间都重现了问题:

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
这是我运行它时得到的输出:

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
$ ./repro-nsync-error.sh 
Cloning into 'bazel'...
remote: Counting objects: 305983, done.     
remote: Compressing objects: 100% (184/184), done.
remote: Total 305983 (delta 127), reused 273 (delta 104), pack-reused 305624
Receiving objects: 100% (305983/305983), 457.28 MiB | 2.62 MiB/s, done.
Resolving deltas: 100% (188973/188973), done.
Checking connectivity... done.
Cloning into 'nsync'...
remote: Counting objects: 944, done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 944 (delta 10), reused 23 (delta 7), pack-reused 910
Receiving objects: 100% (944/944), 316.81 KiB | 0 bytes/s, done.
Resolving deltas: 100% (496/496), done.
Checking connectivity... done.
WARNING: ignoring http_proxy in environment.
Starting local Bazel server and connecting to it...
.........
INFO: Analysed target //:nsync_cpp (10 packages loaded).
INFO: Found 1 target...
ERROR: /home/evadeflow/Desktop/tempxxx/nsync/BUILD:463:1: C++ compilation of rule '//:nsync_cpp' failed (Exit 1): arm-linux-gnueabihf-gcc failed: error executing command 
  (cd /home/evadeflow/.cache/bazel/_bazel_evadeflow/595bcf82ccc39f6a61512641b728b082/execroot/__main__ && \ 
  exec env - \
    PATH=/home/evadeflow/.virtualenvs/tfbootstrap/bin:/home/evadeflow/.local/bin:/home/evadeflow/.virtualenvs/tfbootstrap/bin:/home/evadeflow/.local/bin:/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/home/evadeflow/.local/bin:/usr/local/bin:/usr/bin:/home/evadeflow/bin:/usr/local/sbin:/usr/sbin:/home/evadeflow/bin:/home/evadeflow/bin:/home/evadeflow/bin:/home/evadeflow/bin \
    PWD=/proc/self/cwd \
  tools/arm_compiler/linaro_linux_gcc/arm-linux-gnueabihf-gcc '--sysroot=external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc' '-mfloat-abi=hard' -nostdinc -isystem external/org_linaro_components_toolchain_gcc_5_3_1/lib/gcc/arm-linux-gnueabihf/5.3.1/include -isystem external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/usr/include -isystem external/org_linaro_components_toolchain_gcc_5_3_1/lib/gcc/arm-linux-gnueabihf/5.3.1/include-fixed -isystem external/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/libc/usr/include -U_FORTIFY_SOURCE -fstack-protector -fPIE '-fdiagnostics-color=always' -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -MD -MF bazel-out/armeabi-v7a-fastbuild/bin/_objs/nsync_cpp/internal/dll.pic.d -fPIC -iquote . -iquote bazel-out/armeabi-v7a-fastbuild/genfiles -iquote external/bazel_tools -iquote bazel-out/armeabi-v7a-fastbuild/genfiles/external/bazel_tools -isystem public -isystem bazel-out/armeabi-v7a-fastbuild/genfiles/public -isystem bazel-out/armeabi-v7a-fastbuild/bin/public -x c++ '-std=c++11' -DNSYNC_ATOMIC_CPP11 -DNSYNC_USE_CPP11_TIMEPOINT -I.///platform/c++11 -I.///platform/gcc -I.///platform/arm -I.///public -I.///internal -I.///platform/posix '-D_POSIX_C_SOURCE=200809L' -pthread -no-canonical-prefixes -Wno-builtin-macro-redefined '-D__DATE__="redacted"' '-D__TIMESTAMP__="redacted"' '-D__TIME__="redacted"' -c internal/dll.c -o bazel-out/armeabi-v7a-fastbuild/bin/_objs/nsync_cpp/internal/dll.pic.o)

Use --sandbox_debug to see verbose messages from the sandbox
In file included from internal/dll.c:16:0:
.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
compilation terminated.
Target //:nsync_cpp failed to build
INFO: Elapsed time: 15.023s, Critical Path: 6.77s
INFO: 0 processes.
FAILED: Build did NOT complete successfully
我怀疑nsync的Bazel构建文件并不是为了更好地使用Bazel自定义工具链教程中概述的交叉构建方法而编写的,但是。。。我没有足够的经验与巴泽尔知道如何开始冲压他们的形状

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
更新1:我猜出了谜题的一部分。未能编译的所有文件似乎都有
.c
扩展名,这意味着它们应该是“直接的”c源代码;但是,它们最终包括
platform/c++11/platform.h
,其中包含以下行:

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
#include <mutex>
当我运行此程序时,它会失败,并出现相同的错误,但如果我
s/cxopt/copt
s/isystem/I
如下所示,它将成功编译:

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
#!/bin/bash
# File: build.sh
set -euo pipefail

bazel build -s --verbose_failures --crosstool_top=//tools/arm_compiler:toolchain --cpu=armeabi-v7a \
  --copt="-Iexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/include/c++/5.3.1/arm-linux-gnueabihf" \                                                               
  --copt="-Iexternal/org_linaro_components_toolchain_gcc_5_3_1/arm-linux-gnueabihf/include/c++/5.3.1" \
  --copt="-Iexternal/org_linaro_components_toolchain_gcc_5_3_1/include/c++/5.3.1/arm-linux-gnueabihf" \
  --copt="-Iexternal/org_linaro_components_toolchain_gcc_5_3_1/include/c++/5.3.1" \
  //:nsync_cpp

所以。。。我可以肯定地看到哪里应用了“错误”的编译器标志。但我不确定解决问题的“正确”方法是什么。这似乎是一种“蛮力”的方法,可能会有意想不到的副作用[],所以我仍在寻找更干净的解决方案。

< P>问题是,在交叉窗口中,包含Mutox头的包含目录只被添加到C++命令行中。我可以看到这是怎么回事,互斥体所在的目录是
org\u linaro\u components\u toolchain\u gcc\u 5\u 3\u 1/arm linux gnueabihf/include/c++/5.3.1/mutex
,注意
c++
。如果您认为该目录对于C编译也是有效的,那么原则上的修复方法是在CROSSTOOL中将
cxx\u标志
更改为
compiler\u标志

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory
你说得对,g++与gcc不同。现在有一个问题。但这与您的问题并不相关,只有bazel没有将cxx_标志放入C编译命令行,而不是gcc。还是我遗漏了什么

.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory

我建议不要依赖Bazel测试数据crosstools:)

感谢您确认这正是我解决这个问题的方法,所以我觉得有义务接受您的答案。你能解释一下你说的“我建议不要依赖Bazel测试数据交叉工具”是什么意思吗?我用这个作为起点,因为这是我唯一能找到的东西。最终,我需要为arm64交叉编译tensorflow(使用定制的Yocto工具链,而不是Linaro),我认为首先这样做可以帮助我学习如何为“我的”工具链编写
BUILD
CROSSTOOL
文件。到目前为止,这是一个愚蠢的艰难的过程。这里有什么更简单的方法吗?以它为出发点,这很好,我担心你将来会依赖它的存在。
.///platform/c++11/platform.h:29:17: fatal error: mutex: No such file or directory