omniORB 4使用Autoconf配置脚本来支持构建系统的配置。许多配置脚本都使用--host
和--build
标志来支持交叉编译。不幸的是,omniORB在其README.unix
文件中明确声明不支持交叉编译。
Autoconf构建当前不适用于交叉编译。
当您尝试使用--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, ...
因此,在omniORB构建期间,构建系统似乎构建了该共享对象模块以供omniidl使用。问题在于它是为ARM构建的,不能在主机系统上使用。
鉴于构建系统缺乏支持,如何交叉编译omniORB?
答案 0 :(得分:0)
我在一家名为Tango Controls的公司网站上的instructional post的帮助下找到了解决方案。尽管他们的指示对某些人来说足够了,但对我而言却不够。第一个问题是它不考虑需要针对针对 host 系统构建的库(例如Python)进行包含/链接。第二个问题是它无法正确解决安装问题-当您按照他们的说明进行操作时,最终将安装一些为 build 系统构建的可执行文件和库。
系统术语(由Autoconf定义):
以下是我交叉编译omniORB的步骤:
$ pwd
.../omniORB-4.1.6
$ mkdir build
$ cd build
设置您的环境
PATH
已设置为包括交叉编译工具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
命令是通用的,但您可能仍需要针对自己的设置对其进行修改。
这些工具在omniORB的编译过程中使用,因此需要针对 build 系统进行编译。我们强迫make将 build 系统编译器与CC
和CXX
变量一起使用。 根据构建系统编译器的名称,可能需要对其进行修改。确保这些编译器在您的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帖子中的说明说要使用stdc++
标志将-l
lib添加到某些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
我尚未确定此补丁是否对所有系统和软件版本都是必需的。对于我自己的设置,无论是否安装此补丁程序,构建都能成功完成。如果我了解有关此补丁的更多信息,我将更新此答案。
beforeauto.mk
中以进行ARM omniORB构建 您将需要放置自己的路径来代替...
。
$ 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
$ make
...
$ 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构建的。