【发布时间】:2016-08-17 18:46:41
【问题描述】:
我正在尝试在 x86_64 (linux) 系统上为 RPi 1 构建一个项目。我有一个工作工具链 - 我已经构建了一个小程序并在 RPi(“Hello World”)上运行它。
我正在尝试构建的项目是 gstreamer .
在配置脚本中,我添加了相应的--host=,它会找到所有正确的工具并成功完成。但是,当我做这个项目时, 我收到以下错误:
In file included from gsttracerutils.h:30:0,
from gst_private.h:68,
from gst.c:96:
../gst/gstutils.h: In function '__gst_slow_read64_be':
../gst/gstutils.h:111:61: error: left shift count >= width of type [-Werror=shift-count-overflow]
(((guint##__size) (((const guint8 *) (__data))[__idx])) << (__shift))
^
../gst/gstutils.h:164:36: note: in expansion of macro '_GST_GET'
#define _GST_READ_UINT64_BE(data) (_GST_GET (data, 0, 64, 56) | \
^
../gst/gstutils.h:184:10: note: in expansion of macro '_GST_READ_UINT64_BE'
return _GST_READ_UINT64_BE (data);
^
似乎(至少在我看来)编译器在抱怨 32 位 cpu 上的 64 位类型(这是正确的)。
这是工具链编译器的问题吗?还是别的什么?
我最初(成功地)在 rpi 本身上构建了 gstreamer。但由于这需要很长时间,而且我需要能够重新制作应用程序,所以我想在一个快速的系统上构建它。
为了澄清: 我使用的构建工具链是 crosstool-ng。 我将配置命令运行为:
./configure --disable-gtk-doc --disable-examples --disable-benchmarks --disable-gtk-doc-html --host=armv6-rpi-linux-gnueabihf
并从配置日志(config.log):
## ----------- ##
## Core tests. ##
## ----------- ##
configure:3217: checking build system type
configure:3231: result: x86_64-unknown-linux-gnu
configure:3251: checking host system type
configure:3264: result: armv6-rpi-linux-gnueabihf
configure:3284: checking target system type
configure:3297: result: armv6-rpi-linux-gnueabihf
configure:3343: checking for a BSD-compatible install
configure:3411: result: /usr/bin/install -c
configure:3422: checking whether build environment is sane
configure:3477: result: yes
configure:3536: checking for armv6-rpi-linux-gnueabihf-strip
configure:3552: found /nas/temp/build/rpi/tc/x-tools/armv6-rpi-linux-gnueabihf/bin/armv6-rpi-linux-gnueabihf-strip
configure:3563: result: armv6-rpi-linux-gnueabihf-strip
这表明构建系统是 x86_64,主机和目标是 armv6(...)。
如上所示,错误与处理 64 位数据的宏有关。
我可以使用这个相同的项目树,运行 autogen.sh、configure.sh,然后在 rpi-1 上进行制作(使用 gcc 工具的 pignus 版本 - pignus 是专门针对 rpi-1 的 fedora 23 spin) ,并且它完全构建成功。我还在 x86_64 系统上构建了这个项目,并为它构建了这个项目,这也很成功。
而且,如开头所述,我使用相同的工具链构建了一个简单的程序——“Hello World”程序——它在 x86_64 系统上编译和链接成功,然后在 rpi 上成功运行。
所以,我的问题是:这可能是交叉编译器工具链的问题/错误,还是项目源代码中的问题?关于在哪里寻找或尝试什么的任何建议?
TIA
肯
【问题讨论】:
-
你设置
ARCH和CROSS_COMPILE了吗? -
是的,两者都已设置。此外,这适用于 armv6 处理器 (rpi-1),而不是 v7 (rpi-2/3)。
-
在 configure.sh 脚本中:“--host=" 设置架构和交叉编译标志 (FWIW: --host=armv6-rpi-linux-gnueabihf")。如前所述,这些值有效 - 例如,编译了一个工作应用程序。抱歉,我以为人们知道该配置选项的用途。
-
ARMv7 的事情有点糟糕,因为我没有注意到“Rpi-1”的事情(我不认为它们是“模型 1”,我只是认为它们是 A/B/ +/0,或 ARMv6 版本)——但解释上下文的相关细节并没有什么坏处,显然交叉编译器在这里很重要(我认为 v7 是 linux 发行版自带的原因,而使用 ct-ng等是超越)。
-
..无论如何,宏看起来很纠结。显然你不想费心去改变任何东西,但有可能它实际上是 gstreamer 中的一个极端案例错误。 您可以尝试在他们的 -devel 邮件列表中很好地征求意见:gstreamer.freedesktop.org/lists 实际上看起来就像一个答案刚刚放在 \O/
标签: linux arm cross-compiling gstreamer