5

在过去的三天里,我一直在尝试在我的 Win7 32 位机器和 CodeSourcery Sourcery G++ ARM 工具链上使用虚拟 Ubuntu(12.04)为 TechNexion Blizzard 板(运行未知版本的 Angstrom)交叉编译 Mono 2.11.4 ,但很少/没有成功。我已经按照网络上的每个教程进行操作,但它不起作用。

CodeSourcery Sourcery G++ 工具链和 Scratchbox2(从最新的 git 源代码编译)已安装并且可以工作。Scratchbox2 使用

sb2-init armv7 /home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-gcc

在正确的目录中(~/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/libc)。

我可以编译一个简单的“Hello world”(cpp),在板上编译并运行它。在 Ubuntu 中:

file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped

我下载了 Mono 2.11.4 的源代码并按照其中的说明进行操作。第一部分(在本机机器上)运行良好,没有错误。但是,当我运行第二部分(为 ARM 编译)时,./configure按预期工作,但随后 make 失败,并显示"../lib/mini[some_file] is incompatible with arm output"这些文件上的一个文件说它们确实是 Intel 80386 可执行文件,但我不知道为什么。

所以下一步是运行make clean并重复这些步骤,但它仍然产生了相同的结果。

然后我尝试./configure并在 sb2 中制作整个东西,起初它似乎工作。但随后出现了一些错误,构建中断:

./.libs/libmini.a(libmini_la-mini-arm.o): In function `mono_arch_init':
/home/dev/source/host-mono/mono-2.11.4/mono/mini/mini-arm.c:689: undefined reference to `debugger_agent_single_step_from_context'
/home/dev/source/host-mono/mono-2.11.4/mono/mini/mini-arm.c:689: undefined reference to `debugger_agent_breakpoint_from_context'
/home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-ld: .libs/libmono-2.0.so.1.0.0: hidden symbol `debugger_agent_single_step_from_context' isn't defined
/home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-ld: final link failed: Nonrepresentable section on output

关于我做错了什么的任何想法,或者我可能错过的教程的任何提示?

//安德斯

4

2 回答 2

0

您需要非常小心在交叉编译时针对哪些头文件和库进行编译,否则您可能会发现自己在运行时遇到因库的二进制不兼容而导致的奇怪且违反直觉的崩溃。这么说来,Linux ARM 发行版在二进制兼容性方面非常安全——通常以牺牲性能为代价。

您很有可能正在针对您的开发主机头文件和库进行构建 - 因此架构不匹配。

您可能会发现预先构建的 opkg 映像可以正常工作。Angstrom 为您提供预构建的软件包。它可能就像从 Angstrom 软件包存储库进行网络安装一样简单。

如果您发现确实需要从源代码构建,解决问题的一个简单方法是获取 Angstrom 的构建环境并使用它来构建单声道。解决此问题的最简单方法是从Angtrom 在线映像生成器获取预构建映像(和开发映像)。幸运的是,您的董事会存在一个。

于 2012-11-05T02:05:02.573 回答
0

编译原生代码最好使用 ScratchBox

[sbox-ARMEL: ~] > mkdir cross
[sbox-ARMEL: ~] > cd cross
[sbox-ARMEL: ~] > tar xzf ../mono-x.xx.tar.gz

[sbox-ARMEL: ~] > cd arm-mono-x.xx
[sbox-ARMEL: ~] > ./configure --disable-mcs-build
[sbox-ARMEL: ~] > make 
[sbox-ARMEL: ~] > make install DESTDIR=`pwd`/tmptree

另一方面,打开一个新终端并构建托管代码。

$ mkdir host-mono
$ cd host-mono
$ tar xzf ../mono-1.xx.tar.gz

$ cd mono-1.xx
$ ./configure
$ make
$ make install DESTDIR=`pwd`/tmptree
于 2012-11-04T05:50:26.257 回答