c++ - 如何以跨本地方式在 Crosstools-NG 中使用 canadian 以在 arm board 上获取 gcc?

标签 c++ c gcc cross-compiling crosstool-ng

据我所知,要让 gcc 在 armv5 板上编译可执行文件,同时使用我的 x86 机器编译那个 arm 原生 gcc,我需要这个设置:

  • 配置工具链组件的机器:配置机器:x86_64
  • 构建工具链组件的机器:构建机器:x86_64
  • 运行工具链的机器:主机:ARM
  • 机器工具链正在为以下目标机器生成代码:ARM

基于阅读 cross-ng 文档 here ,我应该使用跨原生设置,但是当我尝试使用 ct-ng menuconfig 启用它时我需要启用:

  • Paths and misc options -> Try features marked as EXPERIMENTAL 中进行实验

  • Toolchain options -> Type (Cross) -> Cross-native (NO CODE!) (EXPERIMENTAL)

当然,Cross-Native 是行不通的,因为它没有代码。谷歌搜索将我带到 thisthis邮件列表上的讨论说我应该尝试使用加拿大构建风格来做到这一点,但我有点迷失了关于 Build System 使用什么元组和什么的东西。和 Host System在 crosstool-ng 的菜单配置中,或者如果这仍然是考虑这两个讨论如何超过 3 年的正确方法。

This SO 上的帖子似乎暗示构建系统和主机系统元组应该是 arm-unknown-linux-gnueabi

明确地说,我已经能够使用从 crosstool-ng 生成的交叉编译器编译和运行可执行文件,现在我想在该 armv5 系统上安装一个编译器。

编辑:所以我只是将 crosstools-ng 生成的普通交叉编译器 ( arm-unknown-linux-gnueabi ) 添加到 Toolchain options -> General toolchain options -> Host system -> Tuple 中的元组中并且能够编译 gcc 并让它在 arm 上执行。 Example

我现在只需要解决图书馆的问题,应该就是这样。

最佳答案

这个答案是我的 original question 的延伸关于交叉编译工具链的一般工作流程。

我的总体思路是正确的,你必须做一个 Canadian-Build,主机系统元组是我制作的 arm-unknown-linux-gnueabi 交叉编译器更早。确保将它包含到您的路径中或对/bin 进行一些符号链接(symbolic link),或者您希望处理它。

在使用普通 HDD 的 Ubuntu Vmware 虚拟机中使用 I5-3570k 的 3/4 内核和约 2GB 内存进行构建时,我不得不等待大约 30 分钟。使用 SSD 可能会显着提高速度。

完成此操作后,您应该拥有 Crosstools-NG 为您制作的输出目录,其中包括 ARM 架构的工具链。您可以通过在任何二进制文件上运行 file filename 来验证这一点。

现在,对于图书馆的情况,我花了一段时间,并且有点困惑。在工具链输出中应该有一个 rootfs 文件夹。该文件夹包含您将为其编译的目标(在本例中为 arm)的预期根文件系统。您需要复制 /lib 文件夹以及来自用户的 lib,以反射(reflect)此 rootfs 文件夹的文件夹层次结构。

您可以通过执行 objdump -p filename 并查看 NEEDED 条目来验证您是否正确设置了库,这些条目指向应该位于 rootfs 中的所需库。

如果您正在使用基于 busybox 的 rootfs,那么假设您没有静态编译它,那么您可能已经正确设置了这些库,因为您需要它们用于 busybox。我首先对 busybox 进行了静态构建,以确保我可以让系统启动到 shell,然后使用工具链 rootfs 文件夹中的库进行了非静态构建,以便对库进行软启动。一旦我得到一个动态链接的 busybox 系统工作,只需将交叉编译的工具链放入任意位置的 rootfs 中(/usr/home/toolchain 对我来说)就足够了,之后你应该使用工具链与引用路径和符号链接(symbolic link)以及您想要执行的任何操作的 x86 系统一样。

关于c++ - 如何以跨本地方式在 Crosstools-NG 中使用 canadian 以在 arm board 上获取 gcc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29201599/

相关文章:

c++ - Qt 线程中未检测到信号和插槽

c++ - Visual Studio 添加真正的 "global"默认包含路径

c - 未知符号 __class_create (错误 0)

c - 这个 valgrind 输出是什么意思,我怎样才能让它显示一些可以理解的东西?

c++ - C++ 标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?

c - sizeof() 具有零长度数组成员的结构

c++ - 匿名枚举类

c - 链接到多个库,其中一个库包装了一组系统调用

c++ - 冲突的 boost 版本

c++ - Clang-CL 警告 strnicmp 已弃用,请使用符合 ISO C 和 C++ 的名称 _strnicmp