交叉编译 gstreamer 失败:x86-64 -> ARMv6 32 位

cross compiling gstreamer fails: x86-64 -> ARMv6 32-bit

我正在尝试在 x86_64 (linux) 系统上为 RPi 1 构建一个项目。我有一个可用的工具链 - 我已经构建了一个小程序并且 运行 它在树莓派上 ("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 位上的 64 位类型 cpu(这是正确的)。

这是工具链编译器的问题吗?还是别的?

我最初在 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 是一个fedora 23 spin specifically for the rpi-1),它完全成功构建。我还在 x86_64 系统上构建了这个项目,这也很成功。

并且,如开头所述,我使用相同的工具链构建了一个简单的程序 - "Hello World" 程序 - 它在 x86_64 系统上成功编译和链接,然后 运行在rpi上成功。

所以,我的问题是:这可能是 problem/bug 与交叉编译器工具链,还是项目源代码中的某些东西?关于在哪里看或尝试什么有什么建议吗?

TIA

从取消选择 those macros 开始,编译器特别抱怨的是将类型 guint64 的值左移 56 位会使类型溢出,因此未定义。

现在,这对我说的是,您正在使用 主机的 glibconfig.h,其中 guint64 必须是 unsigned long,即该机器上的 64 位类型,但一旦将其输入 32 位 ARM 编译器,则为 32 位。在 Pi 本身上,您可能有一个 appropriately-configured glibconfig.h,其中 guint64unsigned long long 的类型定义,因此构建本机工作。

您需要将构建指向 Pi 的 GLib headers 和库,而不是主机的(这个编译错误几乎可以肯定只是将最终失败延迟到 link 当 cross-linker 找到 x86 库并拒绝它们)。我自己没有使用 GStreamer 的经验,所以我不能确切地说出该怎么做,但根据 this mailing list post 我发现,正确的方法似乎涉及覆盖 PKG_CONFIG_PATH.

The problem I am having is exactly that - get the cross compiler to see the target environment and not the build's.

在子目录中安装 Rpi 也是我过去几天的工作,我找到了一个 OsX-host 的描述,但是因为我只有 Windows-computers 我做了一些让 RPi1 在 Trusty 虚拟机的 NFS 共享而不是 SD 卡上启动的解决方法: https://github.com/rmast/rpi-build-and-boot