【问题标题】:Cross Compiling a library from intel to arm交叉编译从 Intel 到 arm 的库
【发布时间】:2011-04-29 13:32:41
【问题描述】:

我正在使用来自http://dicom.offis.de/dcmtk.php.en 的开源 C++ 库 DCMTK。 我已经使用 VC++ IDE、MacOS Xcode、Mac iOS 模拟器在 Windows 上成功编译了这个库。 但我无法在 iOS 设备上编译这个库,因为它是基于 ARM 的架构。 DCMTK 库在 Intel 架构上编译得非常好。

现在我的问题陈述是:-

我需要通过交叉编译在 ARM 架构上编译这个 DCMTK C++ 库。 我正在使用 Ubuntu 64 位机器进行交叉编译。 我已经从http://www.gnuarm.com/ 安装了来自 GNU ARM 工具链的二进制文件 我正在为 Ubuntu 64 位机器使用 GCC 工具链 4.0 binutils-2.16.1、gcc-4.0.2-c-c++、newlib-1.14.0、insight-6.4、TAR BZ2 [65.5MB] 二进制文件进行 ARM 交叉编译。

在 Ubuntu 上安装这些二进制文件后,我将 PATH 环境变量设置为 PATH=$PATH/gnu_arm/bin

为了配置 DCMTK C++ 库,我在 shell 上运行了以下命令

CC=arm-elf-gcc CXX=arm-elf-g++ AR=arm-elf-ar RANLIB=arm-elf-ranlib ARFLAGS=cruv ./configure –prefix=$home_dicom –target=arm-elf –host =arm-elf –enable-std-includes –disable-threads

它会正确地创建一个 make 文件。现在我正在尝试使用 make 命令编译代码,但面临很多编译错误,例如:- 1) 我尝试编译我的第一个依赖 C++ 库,即 ofstd。 我收到了 DIR*、struct dirent、opendir()、closedir() 调用的错误。 它包含这些调用,但我没有在此头文件中找到上述调用的任何定义。

2) 当我编译另一个日志库时,出现以下错误,例如 错误:未在此范围内声明 nthos 错误:ntohl 未在此范围内声明 错误:未在此范围内声明 htons 错误:未在此范围内声明 htonl。 这些调用是网络调用,并未在 GNU ARM 工具的任何头文件中定义。

我尝试下载 ARM 二进制文件的源代码并解压缩 tar 文件,并尝试将丢失的头文件复制到 Ubuntu 上已安装的 GNU ARM。 对于某些文件,它在对复制的头文件进行更改后编译,而对于某些文件,它再次给出编译错误。由于缺少一些标准头文件,因此 DCMTK 库下存在的每个文件都会出现编译错误循环。

请建议是否有任何其他工具链可用于 Ubuntu 64 位机器上的 ARM 交叉编译。 或者除此之外的任何其他好的解决方案。

谢谢!!! 阿米特

【问题讨论】:

    标签: ios cross-compiling


    【解决方案1】:

    在交叉编译方面存在许多问题。交叉编译有三个主要标志。 -host 、 -target 和 -build。 -host flash 是生成的二进制文件将在其中运行的机器。 -build flash 是您将在其中进行编译的系统。 -target 标志用于构建将在交叉编译中使用的库。因此,如果您要构建自己的 gcc 工具链。因此,在您的情况下,您不会设置目标标志,因为我们没有构建工具链。 -host 标志将是 arm-elf。 -build 标志将是 amd64。

    【讨论】:

    • AFAIK 这是错误的。 --host 定义架构程序将运行。 --target 与开发工具一起使用。因此,例如,您可以构建 gdb 以在架构 X(--host)上运行并调试为架构 Y(--target)编写的程序。 --build 定义构建机器。
    • 啊。我认为你是对的。我会更新我的帖子,以免混淆其他人。
    【解决方案2】:

    如果常规 c 编译器和交叉编译器之间存在不一致,交叉编译通常会失败。我已经使用 buildroot 生成的工具链为 avr32 编译了几个库,但在某些情况下(例如 socat 项目)这是不可能的。

    您的主机、您的目标和 CXX 标志看起来没问题。我认为没有必要放置 AR 标志(这是带有主机和目标选项的想法)。

    另一方面,这是 avr32 的 expat 库的示例:

    ./configure --host=avr32-linux --prefix=/home/juan/builds/build_expat/ CC=avr32-linux-gcc
    make; make install 
    

    我可以建议您尝试从 ia32 架构进行交叉编译。过去我在使用那个 ubuntu 时遇到过几个问题。

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多