如何交叉编译 omniORB 4(在 x86_64 for ARM with omniORB 4.1.6)
How to cross-compile omniORB 4 (on x86_64 for ARM with omniORB 4.1.6)
omniORB 4 使用 Autoconf 配置脚本来支持构建系统的配置。许多配置脚本支持使用 --host
和 --build
标志进行交叉编译。不幸的是,omniORB 在其 README.unix
文件中明确声明不支持交叉编译。
The Autoconf build does not currently work for cross compiling.
以下是当您尝试使用 --host
和 --build
Autoconf 标志时会发生的情况:
环境:
PATH
设置包含交叉编译工具
CPPFLAGS
设置为包含 ARM sysroot/include 文件夹 -I.../sysroot/include
LDFLAGS
设置为包含 ARM sysroot/lib 文件夹 -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 的公司网站上 instructional post 的帮助下找到了我的解决方案。虽然他们的指示对某些人来说可能足够了,但对我来说还不够。第一个问题是它没有考虑 include/link 针对为 host 系统构建的库(例如 Python)的需要。第二个问题是它没有正确解决安装问题 - 当您按照他们的说明进行操作时,您最终会安装一些为 build 系统构建的可执行文件和库。
系统术语(由 Autoconf 定义):
- build - 您正在编译代码的机器 (x86_64)
- host - 您希望在 (ARM)
上执行二进制文件的机器
以下是我对 cross-compile omniORB 采取的步骤:
- 创建并进入构建目录
$ pwd
.../omniORB-4.1.6
$ mkdir build
$ cd build
设置您的环境
PATH
设置为包含 cross-compilation 工具
CPPFLAGS
设置包含 ARM sysroot/include 文件夹 -I.../sysroot/include
LDFLAGS
设置包含 ARM sysroot/lib 文件夹 -L.../sysroot/lib
配置
根据需要设置您自己的 --prefix
并根据您的设置修改 CC
和 CXX
。您可能还需要更改 --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++
...
注意:我使用三个点 (...) 来省略部分文件路径或不重要的输出。
- 从
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
命令是通用的,但您可能仍需要根据自己的设置修改它们。
- 为 build 系统制作工具
omniORB编译时会用到这些工具,所以需要为build系统编译。我们强制 make 使用带有 CC
和 CXX
变量的 build 系统编译器。 这些可能需要根据您的构建系统编译器的名称进行修改。确保这些编译器在您的 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
...
- 补丁构建系统 - 可能没有必要
Tango post 的说明说要将 stdc++
库添加到一些带有 -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
我还不确定是否所有系统和软件版本都需要这个补丁。对于我自己的设置,无论有没有这个补丁,构建都会成功。如果我了解有关此补丁的更多信息,我将更新此答案。
- 为 ARM omniORB build
将包含和库路径放回 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
- Cross-compileomniORB
$ make
...
- Cross-compile 我们最初为 build 系统构建的工具
$ 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
...
- 安装一切
$ make install
...
我们完成了!您现在应该能够使用 file
命令检查已安装的二进制文件,并查看它们是为 ARM 构建的。
omniORB 4 使用 Autoconf 配置脚本来支持构建系统的配置。许多配置脚本支持使用 --host
和 --build
标志进行交叉编译。不幸的是,omniORB 在其 README.unix
文件中明确声明不支持交叉编译。
The Autoconf build does not currently work for cross compiling.
以下是当您尝试使用 --host
和 --build
Autoconf 标志时会发生的情况:
环境:
PATH
设置包含交叉编译工具CPPFLAGS
设置为包含 ARM sysroot/include 文件夹-I.../sysroot/include
LDFLAGS
设置为包含 ARM sysroot/lib 文件夹-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 的公司网站上 instructional post 的帮助下找到了我的解决方案。虽然他们的指示对某些人来说可能足够了,但对我来说还不够。第一个问题是它没有考虑 include/link 针对为 host 系统构建的库(例如 Python)的需要。第二个问题是它没有正确解决安装问题 - 当您按照他们的说明进行操作时,您最终会安装一些为 build 系统构建的可执行文件和库。
系统术语(由 Autoconf 定义):
- build - 您正在编译代码的机器 (x86_64)
- host - 您希望在 (ARM) 上执行二进制文件的机器
以下是我对 cross-compile omniORB 采取的步骤:
- 创建并进入构建目录
$ pwd
.../omniORB-4.1.6
$ mkdir build
$ cd build
设置您的环境
PATH
设置为包含 cross-compilation 工具CPPFLAGS
设置包含 ARM sysroot/include 文件夹 -I.../sysroot/includeLDFLAGS
设置包含 ARM sysroot/lib 文件夹 -L.../sysroot/lib
配置
根据需要设置您自己的 --prefix
并根据您的设置修改 CC
和 CXX
。您可能还需要更改 --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++
...
注意:我使用三个点 (...) 来省略部分文件路径或不重要的输出。
- 从
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
命令是通用的,但您可能仍需要根据自己的设置修改它们。
- 为 build 系统制作工具
omniORB编译时会用到这些工具,所以需要为build系统编译。我们强制 make 使用带有 CC
和 CXX
变量的 build 系统编译器。 这些可能需要根据您的构建系统编译器的名称进行修改。确保这些编译器在您的 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
...
- 补丁构建系统 - 可能没有必要
Tango post 的说明说要将 stdc++
库添加到一些带有 -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
我还不确定是否所有系统和软件版本都需要这个补丁。对于我自己的设置,无论有没有这个补丁,构建都会成功。如果我了解有关此补丁的更多信息,我将更新此答案。
- 为 ARM omniORB build 将包含和库路径放回
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
- Cross-compileomniORB
$ make
...
- Cross-compile 我们最初为 build 系统构建的工具
$ 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
...
- 安装一切
$ make install
...
我们完成了!您现在应该能够使用 file
命令检查已安装的二进制文件,并查看它们是为 ARM 构建的。