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

时间:2016-08-12 15:51:26

标签: linux arm cross-compiling gstreamer

我正在尝试在x86_64(linux)系统上为RPi 1构建一个项目。我有一个工作工具链 - 我已经构建了一个小程序并在RPi上运行它(" Hello World&#34 ;)

我正在尝试构建的项目是 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命令运行为:

./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本身上制作(使用gign工具的pignus版本 - pignus是一个专门用于rpi-1的fedora 23旋转) ,它完全构建成功。我还在x86_64系统上构建了这个项目,该系统也很成功。

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

所以,我的问题是:这可能是交叉编译工具链的问题/错误,还是项目源中的某些东西?关于在哪里寻找或尝试什么的任何建议?

TIA

2 个答案:

答案 0 :(得分:1)

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

现在,对我说的是你正在拿起主机的 glibconfig.h,其中guint64必须是unsigned long的typedef,即该机器上的64位类型,但一旦将其送入32位ARM编译器,就会为32位。在Pi本身你可能有一个适当配置的glibconfig.h,其中guint64unsigned long long的typedef,因此构建本身就可以工作。

你需要将构建指向Pi的GLib头和库而不是主机(这种编译错误几乎肯定只是在交叉链接找到x86库并拒绝它们时延迟链接的最终失败)。我自己没有使用GStreamer的经验,所以我不能确切地说如何做到这一点,但根据this mailing list post我发现,正确的方法似乎涉及重写PKG_CONFIG_PATH。

答案 1 :(得分:0)

  

我遇到的问题就是 - 让交叉编译器看到目标环境而不是构建版本。

将Rpi挂载到子目录中也是我过去几天工作的东西,我找到了一个OsX主机的描述,但由于我只有Windows计算机,我做了一些解决方法让RPi1在NFS上启动 - Trusty虚拟机的共享而不是SD卡: https://github.com/rmast/rpi-build-and-boot