2011-06-16 143 views
0

我正在编译从源的nexus一个android内核在HTCs developer website上找到。我通过DLing来自android dev站点的android NDK获得了ARM工具链。我能够运行make clean并且无需事先做出defconfig,但是当我运行make时,在运行编译器错误之前它只会变得非常费劲。交叉编译为Android使用NDK失败,编译器错误

目前我看到下列情况:

$MY_DIR/nexus_one/arch/arm/include/asm/glue.h:156:29: error: '#' is not followed by a macro parameter

有问题的行是:

1 /* 
2 * Instruction Fault Status Register. (New register as of ARMv6) 
3 * If processor has IFSR then set value, else set translation fault 
4 */ 
5 #if defined(CONFIG_CPU_ABRT_EV7) || defined(CONFIG_CPU_ABRT_EV6) 
6 # define CPU_PABORT_IFSR(reg) mrc p15, 0, reg, cr5, cr0, 1   @asm macro; 
7 #else 
8 # define CPU_PABORT_IFSR(reg) mov reg, #5       @asm macro; 
9 #endif 

具体而言,线8的上方是什么软管编译器。显然你不能有第二个#号,但我不确定这个代码里发生了什么,它看起来很重要,所以我不想去碰它。

我猜我正在编译错误的工具链也许?或者我可能以某种方式配置了错误的东西?有没有人知道这是什么?

感谢, 布赖恩

+0

fyi,我已经尝试过这样的4个不同的工具链,所以我开始认为特定的交叉编译器不是问题。我不确定还有什么要看。 – 2011-06-16 22:22:31

回答

1

原来这是无关的特定工具链。 #号需要'转义'某种。解决方案如下:

/* this is needed to get the mov reg, 5 macro to compile and function correctly */ 
#define hash_hackery # 
#define f(x) x 

#if defined(CONFIG_CPU_ABRT_EV7) || defined(CONFIG_CPU_ABRT_EV6) 
# define CPU_PABORT_IFSR(reg) mrc p15, 0, reg, cr5, cr0, 1   @asm macro; 
#else 
# define CPU_PABORT_IFSR(reg) mov reg, f(hash_hackery)5   @asm macro; 
#endif 

This post在寻找答案时非常翔实。

1

我强烈建议你使用CodeSourcery的工具链的Linux编译Linux内核。

+0

这是我triedi *认为*的第一个。我会再试一次,看看它是否有所作为。谢谢! – 2011-06-17 15:16:21

+0

只是好奇;什么特别让你推荐这个工具链? – 2011-06-17 15:17:06

+1

所以我以前曾尝试使用codesourcery中的类似但独特的工具链,并且现在在这两种情况下都看到了相同的错误(再加上ndk工具链)。所以我想这个问题一定是别的。 – 2011-06-17 16:04:31