編譯鏈方案
⑴ AT91SAM9G45使用什麼編譯鏈
簡答:
1.「編譯鏈」
你說的:編譯鏈
據我所知:是不妥的叫法
正確的叫法是:交叉工具鏈
也常叫做:交叉編譯器
2.關於交叉工具鏈/交叉編譯器
首先,你需要先搞懂,什麼是交叉工具鏈
詳見:
交叉編譯詳解
3.給定一個CPU/MCU/SoC,如何確定其所用的交叉工具鏈?
主要邏輯是:
確定該CPU/MCU/SoC所用的CPU內核
然後根據對應的CPU內核,去找其對應的,可用的交叉工具鏈。
針對你這里的:AT91SAM9G45
隨便去用google搜了下:
AT91SAM9G45
而找到:
AT91SAM9G45 – ARM926-based eMPU
可知:
是基於ARM926的內核的。
所以:
去找,支持ARM926內核的,交叉工具鏈,即可。
進一步的,通過:
ARM926 處理器
知道了:
ARM926的內核架構是ARMv5TEJ
所以:
去找,
支持ARMv5的交叉編譯器
或者是支持ARMv5TEJ的交叉編譯器
也就支持了ARM926
也就支持了你的:AT91SAM9G45
4.在哪裡可以得到,下載到所需要的交叉工具鏈?
關於此問題,之前教程已經解釋的足夠詳細了。
詳見:
如何得到交叉編譯器
對於你此處的,所需要的:
支持ARM926內核的,交叉工具鏈
去幫你找找:
找到一些:
找到的支持ARMv5或ARMv5TEJ或ARM926或AT91SAM9G45的交叉編譯器
1.這里:
Distcc Cross-Compiling
也有你要的,直接編譯好的,你可以直接下載試用的:
(支持了armv5的arm-unknown-linux-gnueabi)
ARMv5tesoft
http://archlinuxarm.org/builder/xtools/x-tools.tar.xz
詳解:
專門寫帖子:
【問題解答】AT91SAM9G45使用什麼編譯鏈?
給你極其詳盡的解釋:
原理,邏輯,如何找,怎麼找,並且給你找了不止一個。
註:這里不能貼地址,自己google搜標題即可。
⑵ 如何使用自己的makefile編譯android ndk項目
android ndk提供了一套自己的makefile管理方式,要將源碼項目移植到android平台,需要按照android的makefile規則編寫makefile,還要按android的規則部署源碼目錄,對一個有自己的makefile管理方法的大型項目來說,只是做一下makefile遷移工作就是一件很麻煩的事。
其實android ndk上的編譯說到底也就是交叉編譯,只要配置好交叉編譯工具鏈,使用原有的makefile也是可以編譯出在android運行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本為例:
編譯器路徑 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名稱前綴 arm-eabi-
頭文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
庫文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以試一下上面的配置,如果編譯鏈接都沒有問題,可以adb push到android設備上運行看看,什麼結果?
有點崩潰,根本運行不起來,你也許想試試看android自帶的ndk例子,確實是能夠運行的,問題在哪兒呢?
只是正確配置了編譯器、頭文件、庫文件還不夠,還需要配置編譯、鏈接的參數,android例子中編譯鏈接的參數是什麼呢?你也許想深究一下android的makefile,可是不久你會發現那是更崩潰的事情,裡面用了很多的make腳本函數。其實android的makefile是可以把執行的詳細命令輸出來的,只要make的時候加上V=1即可。可以看到確實帶了很多參數
編譯參數:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
鏈接參數:
-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,noreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
這其中鏈接參數中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最關鍵的,android使用了自己的進程載入器,並且自定義了c運行時的啟動結束。難怪先前編譯的進程啟動不了。