2011-06-16 209 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