如何交叉编译 omniORB 4(在 ARM 的 x86_64 上与 omniORB 4.1.6)



omniORB 4 使用 Autoconf 配置脚本来支持构建系统的配置。许多配置脚本支持使用--host--build标志进行交叉编译。不幸的是,omniORB 在其README.unix文件中明确声明不支持交叉编译。

Autoconf 版本当前不适用于交叉编译。

以下是当您尝试使用--host--buildAutoconf 标志时发生的情况:

环境:

  • PATH设置为包括交叉编译工具
  • CPPFLAGS设置为包含 ARM 系统根目录/包含文件夹-I.../sysroot/include
  • LDFLAGS设置为包含 ARM 系统根/库文件夹-L.../sysroot/lib

注意:我使用三个点 (...) 来省略部分文件路径或不重要的输出。

$ pwd
.../omniORB-4.1.6
$ mkdir build
$ cd build
$ ../configure --build=x86_64-linux-gnu --host=arm-linux-gnueabihf
...
$ make
...
omniidl: ERROR!
omniidl: Could not open IDL compiler module _omniidlmodule.so
omniidl: Please make sure it is in directory .../omniORB-4.1.6/build/lib
omniidl: (or set the PYTHONPATH environment variable)
omniidl: (The error was '.../omniORB-4.1.6/build/lib/_omniidlmodule.so: wrong ELF class: ELFCLASS32')
...

我相信那里的重要信息是wrong ELF class: ELFCLASS32.我用file检查了这个共享对象库。

$ file lib/_omniidlmodule.so.4.1
lib/_omniidlmodule.so.4.1: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, ...

因此,构建系统似乎构建了这个共享对象模块,供 omniidl 在 omniORB 构建期间使用。问题是它是为 ARM 构建的,不能在主机系统上使用。

鉴于缺乏构建系统的支持,我如何交叉编译 omniORB?

我在一家名为Tango Controls的公司网站上的指导帖子的帮助下找到了我的解决方案。虽然他们的指示对某些人来说可能足够,但对我来说还不够。第一个问题是它没有考虑包含/链接为主机系统构建的库(例如 Python)的必要性。第二个问题是它没有正确解决安装问题 - 当您按照他们的说明进行操作时,您最终将安装一些为构建系统构建的可执行文件和库。

系统术语(由自动会议定义):

  • 构建 - 您正在编译代码的计算机 (x86_64)
  • 主机 - 要在其上执行二进制文件的计算机 (ARM)

以下是我交叉编译 omniORB 的步骤:

  1. 创建并输入构建目录
$ pwd
.../omniORB-4.1.6
$ mkdir build
$ cd build
  1. 设置环境

    • PATH设置为包括交叉编译工具
    • CPPFLAGS设置为包含 ARM 系统根/包含文件夹 -I.../sysroot/include
    • LDFLAGS设置为包含 ARM sysroot/lib 文件夹 -L.../sysroot/lib
  2. 配置

根据需要设置您自己的--prefix,并根据您的设置修改CCCXX。您可能还需要更改--build--host设置。

$ ../configure --build=x86_64-linux-gnu --host=arm-linux-gnueabihf --prefix=.../sysroot 
CC=.../bin/arm-linux-gnueabihf-gcc 
CXX=.../bin/arm-linux-gnueabihf-g++
...

注意:我使用三个点 (...) 来省略部分文件路径或不重要的输出。

  1. beforeauto.mk中删除x86_64工具构建的包含和库路径
$ sed -i 's#CPPFLAGS = -I.*include $(DIR_CPPFLAGS) $(IMPORT_CPPFLAGS)#CPPFLAGS = $(DIR_CPPFLAGS) $(IMPORT_CPPFLAGS)#' mk/beforeauto.mk
$ sed -i 's#CLINKOPTIONS    = -L.*lib $(CDEBUGFLAGS) $(COPTIONS)#CLINKOPTIONS    = $(CDEBUGFLAGS) $(COPTIONS)#' mk/beforeauto.mk
$ sed -i 's#CXXLINKOPTIONS  = -L.*lib $(CXXDEBUGFLAGS) $(CXXOPTIONS)#CXXLINKOPTIONS  = $(CXXDEBUGFLAGS) $(CXXOPTIONS)#' mk/beforeauto.mk

这些sed命令是通用的,但您可能仍需要根据自己的设置对其进行修改。

  1. 构建系统制作工具

这些工具在编译 omniORB 期间使用,因此需要针对构建系统进行编译。我们强制 make 使用带有CCCXX变量的构建系统编译器。这些可能需要修改,具体取决于构建系统编译器的名称。确保这些编译器在您的PATH上。

$ make CC=gcc -C src/tool/omniidl/cxx/cccp
...
$ make CXX=g++ -C src/tool/omniidl/cxx
...
$ make CC=gcc -C src/tool/omkdepend
...
  1. 补丁构建系统 -可能不是必需的

来自 Tango 帖子的说明说将stdc++lib 添加到一些带有-l标志的 make 命令中。以下sed命令可用于此修补程序。

$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/omniMapper/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/omniNames/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/utils/catior/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/utils/convertior/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/utils/genior/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/utils/nameclt/dir.mk

我尚未确定此补丁是否适用于所有系统和软件版本。对于我自己的设置,无论有没有此补丁,构建都会成功。如果我了解有关此补丁的更多信息,我将更新此答案。

  1. 将包含和库路径放回 ARM omniORB 构建的beforeauto.mk

您将需要用自己的路径代替....

$ sed -i 's#CPPFLAGS = $(DIR_CPPFLAGS) $(IMPORT_CPPFLAGS)#CPPFLAGS = -I.../sysroot/include $(DIR_CPPFLAGS) $(IMPORT_CPPFLAGS)#' mk/beforeauto.mk
$ sed -i 's#CLINKOPTIONS    = $(CDEBUGFLAGS) $(COPTIONS)#CLINKOPTIONS    = -L.../sysroot/lib $(CDEBUGFLAGS) $(COPTIONS)#' mk/beforeauto.mk
$ sed -i 's#CXXLINKOPTIONS  = $(CXXDEBUGFLAGS) $(CXXOPTIONS)#CXXLINKOPTIONS  = -L.../sysroot/lib $(CXXDEBUGFLAGS) $(CXXOPTIONS)#' mk/beforeauto.mk
  1. 交叉编译 omniORB
$ make
...
  1. 交叉编译我们最初为构建系统构建的工具
$ make -C src/tool/omniidl/cxx/cccp clean
...
$ make -C src/tool/omniidl/cxx clean
...
$ make -C src/tool/omkdepend clean
...
$ make -C src/tool/omniidl/cxx/cccp
...
$ make -C src/tool/omniidl/cxx
...
$ make -C src/tool/omkdepend
...
  1. 安装所有内容
$ make install
...

大功告成!现在,您应该能够使用file命令检查已安装的二进制文件,并查看它们是为 ARM 构建的。

最新更新