omniORB 4使用Autoconf配置脚本来支持构建系统的配置。许多配置脚本支持使用--host和--build标志进行交叉编译。不幸的是,omniORB在其README.unix文件中明确声明不支持交叉编译。
Autoconf生成当前不适用于交叉编译。
当您尝试使用--host和--build Autoconf标志时,会发生以下情况:
环境:
PATH设置为包含交叉编译工具。CPPFLAGS设置为包含ARM sysroot/ -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?
发布于 2019-06-12 14:18:17
我在一家名为Tango的公司网站上的教学岗位帮助下找到了我的解决方案。虽然他们的指示可能对某些人来说是足够的,但对我来说却是不够的。第一个问题是,它没有考虑是否需要包含/链接为宿主系统构建的库(例如Python)。第二个问题是,它没有正确地解决安装问题--当您按照他们的指示运行时,最终会安装一些为构建系统构建的可执行文件和库。
系统术语(由Autoconf定义):
下面是我交叉编译omniORB的步骤:
$ pwd
.../omniORB-4.1.6
$ mkdir build
$ cd build- `PATH` set to include the cross-compilation tools
- `CPPFLAGS` set to include the ARM sysroot/include folder -I.../sysroot/include
- `LDFLAGS` set to include the ARM sysroot/lib folder -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时使用的,因此需要为构建系统进行编译。我们强制make使用带有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标志的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构建的。
https://stackoverflow.com/questions/56550851
复制相似问题