armcc編譯產生文件格式
① keil for arm編譯的文件擴展名也是.vu2么
從原理圖可以看出,如果我們想讓接在P1.0口的LED1亮起來,那麼我們只要把P1.0口的電平變為低電平就可以了;相反,如果要接在P1.0口的LED1熄滅,就要把P1.0口的電平變為高電平就可以;同理,接在P1.1~P1.7口的其他7個LED的點亮和熄滅方法方法同LED1。因此,要實現流水燈功能,我們只要將LED2~LED8依次點亮、熄滅,依始類推,8隻LED變會一亮一暗的做流水燈了。
實現8個LED流水燈程序用中文表示為:P1.0低、延時、P1.0高、P1.1低、延時、P1.1高、P1.2低、延時、P1.2高、P1.3低、延時、P1.3高、P1.4低、延時、P1.4高、P1.5低、延時、P1.5高、P1.6低、延時、P1.6高、P1.7低、延時、P1.7高、返回到開始、程序結束。
從上面中文表示看來實現單片機流水燈很簡單,但是我們不能說P1.0你變低,它就變低了。因為單片機聽不懂我們的漢語的,只能接受二進制的「1、0......」機器代碼。我們又怎樣來使單片機按我們的意思去工作呢?為了讓單片機工作,只能將程序寫為二進制代碼交給其執行;早期單片機開發人員就是使用人工編寫的二進制代碼交給單片機去工作的。今天,我們不必用煩人的二進制去編寫程序,完全可以將我們容易理解的「程序語言」通過「翻譯」軟體「翻譯」成單片機所需的二進制代碼,然後交給單片機去執行。這里的「程序語言」目前主要有匯編語言和C語言兩種;在這里我們所說的「翻譯」軟體,同行們都叫它為「編譯器」,將「程序語言」通過編譯器產生單片機的二進制代碼的過程叫編譯。前面說到,要想使LED1變亮,只需將對應的單片機引腳電平變為低電平就可以了。現在讓我們將上面提到的8隻LED流水燈實驗寫為匯編語言程序。
實現8個LED流水燈匯編語言源程序 liu01.asm
;----- 主程序開始 -----
START: CLR P1.0 ;P1.0輸出低電平,使LED1點亮
ACALL DELAY ;調用延時子程序
SETB P1.0 ;P1.0輸出高電平,使LED1熄滅
CLR P1.1 ;P1.1輸出低電平,使LED2點亮
ACALL DELAY ;調用延時子程序
SETB P1.1 ;P1.1輸出高電平,使LED2熄滅
CLR P1.2 ;P1.2輸出低電平,使LED3點亮
ACALL DELAY ;調用延時子程序
SETB P1.2 ;P1.2輸出高電平,使LED3熄滅
CLR P1.3 ;P1.3輸出低電平,使LED4點亮
ACALL DELAY ;調用延時子程序
SETB P1.3 ;P1.3輸出高電平,使LED4熄滅
CLR P1.4 ;P1.4輸出低電平,使LED5點亮
ACALL DELAY ;調用延時子程序
SETB P1.4 ;P1.4輸出高電平,使LED5熄滅
CLR P1.5 ;P1.5輸出低電平,使LED6點亮
ACALL DELAY ;調用延時子程序
SETB P1.5 ;P1.5輸出高電平,使LED6熄滅
CLR P1.6 ;P1.6輸出低電平,使LED7點亮
ACALL DELAY ;調用延時子程序
SETB P1.6 ;P1.6輸出高電平,使LED7熄滅
CLR P1.7 ;P1.7輸出低電平,使LED8點亮
ACALL DELAY ;調用延時子程序
SETB P1.7 ;P1.7輸出高電平,使LED8熄滅
ACALL DELAY ;調用延時子程序
AJMP START ;8個LED流了一遍後返回到標號START處再循環
;----- 延時子程序 -----
DELAY: MOV R0,#255 ;延時一段時間
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ;子程序返回
END ;程序結束
在上面主程序中用到了五條匯編語言指令:CLR、ACALL、SETB、LJMP、END。
CLR: 是將其後面指定的位清為0,程序中使對應埠輸出低電平
ACALL:是子程序調用指令,程序中調用了DELAY延時子程序
SETB:是將其後面指定的位置成1,程序中使對應埠輸出高電平
AJMP:是無條件跳轉指令,意思是:跳轉到指定的標號處繼續運行
END: 是程序結束的偽指令,意思是告訴編譯器,程序到此結束。偽指令只告訴編譯器此程序到此有何要求或條件,它不參與和影響程序的執行。
在上面源程序中"ACALL DELAY"指令的作用是調用DELAY延時子程序。為什麼要使用這指令呢?如果不用該指令能夠實現"流水"效果嗎?答案是肯定的,一定要用該指令才能看到我們需要的"流水"效果。如果不用該指令,則由於8個LED發光與熄滅的時間都很短,我們肉眼無法看到LED的熄滅與點亮,憑我們肉眼看到的是LED1~LED8都同時亮(半亮),而看不到「流水」效果的!註:初學者可以將上面源程序中所有"ACALL DELAY"指令行刪除後再編譯後燒寫到單片機進行驗證一下。
產生這種現象主要是因為單片機執行每條指令的時間很短,我們知道實驗板上單片機的時鍾高達11.0592MHz,在這個時鍾信號(即晶體振盪信號)下,一個「機器周期」僅大約1.08uS(微秒)。本程序中我們用到的SETB P.x和CLR P.x均屬於單周期指令,也就是說,執行一句 SETB P.x 用時僅1.08uS(微秒),CLR P.x 也是1.08uS(微秒);也就是點亮和熄滅時間都為1.08uS(微秒),在如此高速的流水速度下,8個LED發光與熄滅的時間都很短,當然憑我們的肉眼看不到「流水」效果了!
這里需要說明的是,按匯編語法要求,所編制的程序(下稱源程序)之格式和書寫要求必須依下列原則:
1、源程序必須為純文本格式文件,如用Windows「附件」中的「記事本」編寫的文本文件或用UltraEdit文本編輯器編輯;
2、源程序的擴展名應是 *.ASM;
3、一行只能寫一條語句,以回車作為本句的結束,每一語句行長度應少於80個字元(即40個漢字)。
4、每行的格式應為:標號: 命令 參數 ;注釋 。即一行由四部份組成,各部份的順序不能搞錯,依實際要求可以預設其中的一部份或幾部份,甚至全部省去,即空白行。需要使用標號時標號後面必須有「:」(冒號),而命令語句和參數之間必須用空格分開,如果命令有多個參數,則參數與參數之間必須用「,」(逗號)分開,需要注釋時注釋前必須用「;」(分號),「;」後面的語句可以寫任何字元,包括漢字用於解釋前面的匯編語句,它將不參與匯編,不生成代碼。由於匯編程序對我們還不直觀,所以在編寫源程序時,應當養成多寫注釋的習慣,這樣有助於今後源程序的閱讀和維護。
標號是標志程序中某一行的符號名,編譯後標號的數值就是標號所在行代碼的地址。在宏匯編ASM51中標號的長度不受限制,但標號中不能包含『:'或其它的一些特殊符號,也不能用漢字,可以用數字作標號,但必須用字母開頭。當標號作參數用(如標號作轉移地址),在命令後面出現時,必須捨去『:'(如上面程序中的 AJMP START中的START是不能再有:)。每行只能有一個標號,一個標號只能用在一處,如果有兩行用了同一個標號,則匯編時就會出錯。由於標號的長度沒有限制,可以用有意義的英文或漢語拼音來說明行,使源程序讀起來更方便。在源程序中的字母不區分大小寫,也就是說 start 和 START 是一樣的,請不要用大小寫方式去區分不同的標號。
好啦!我們知道了匯編語言程序的規則,現在就動手編輯源程序吧。馬上啟動Keil單片機集成開發環境,建立新工程liu01.UV2,將上面的源程序liu01.asm導入到工程中,設置好Keil工程的編譯參數,編譯得到HEX格式的目標文件liu01.hex,用 ISP編程器 將目標文件liu01.hex燒寫到AT89S51單片機中,接下來就是將燒寫好的AT89S51從編程器上取下,放到「 S51增強型單片機實驗板 」上通電,我們就看到了LED1~LED8的"流水"效果了。
到此,我們做的流水燈已成功,工作原理也清楚啦,若你完全掌握了上面程序,那麼你就可以將「流水燈」的流向改變一下,可以將從"左向右流"改為從"右向左流",也可以改為"兩邊向內流"、"內部向外流"......,我想你一定能用前面學到的方法實現這些功能。可能有些高手說,前面的編程方法是最最笨的!不錯!但初學單片機初期可以不必講究語言的簡練,只要能實現預先要求就好,最主要的是學好基本指令(111條)的用法,清楚各個指令的功能,這是初學者要知道的。那麼還有更好的編程思路嗎?當然有!請跟隨站長繼續學習下面的內容。
在前面學習的程序中我們讓LED流水是去逐個控制P1埠的每個位來實現的,因此程序顯得有點復雜,下面我們就採用新的思路來編程。新的編程思路如下:我們在程序一開始就給P1口送一個數,這個數本身就讓P1.0先低,其他位為高,然後讓這個數據向高位移動不就實現「流水」效果啦?的確如此!8051指令中沒有讓P1數據移動的指令,但有對累加器ACC中數據左移或右移的指令,ACC在指令中常寫為A,累加器A數據左移指令為"RL A",累加器數據右移指令為"RR A",累加器在數據傳輸和數據處理過程中作用十分重要,累加器ACC為8位。他可與片內所有單位元組寄存器交換數據,實際上P1和其他埠在單片機中也是一個寄存器。這樣我們可以將需移動的數據先放到ACC中,讓其移動,然後將ACC移動後的數據再轉送到P1口,這樣同樣可以實現「流水」效果。下面程序就是採用新的編程思路源程序liu02.asm。
實現8個LED流水燈匯編語言程序 liu02.asm
;----- 主程序開始 -----
START: MOV ACC,#0FEH ;ACC中先裝入LED1亮的數據(二進制的11111110)
MOV P1,ACC ;將ACC的數據送P1口
MOV R0,#7 ;將數據再移動7次就完成一個8位流水過程
LOOP: RL A ;將ACC中的數據左移一位
MOV P1,A ;把ACC移動過的數據送p1口顯示
ACALL DELAY ;調用延時子程序
DJNZ R0,LOOP ;沒有移動夠7次繼續移動
AJMP START ;移動完7次後跳到開始重來,以達到循環流動效果
;----- 延時子程序 -----
DELAY: MOV R0,#255 ;延時一段時間
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ;子程序返回
END ;程序結束
接下來,我們將上述程序編譯,並燒寫到實驗晶元中,放到實驗板上可以看到程序的"流水"效果是一樣的,但源程序看起來更加簡潔,直觀。其實8051單片機有111條指令,有的指令常用,有的指令不常用,只要遵守語法規則,你可以用這些指令「組合」成你想像到的任何程序。當然,有時一條指令可以替代很多條指令,這樣會使程序簡潔,程序代碼減少,在編寫較大程序時可以讓程序存儲器放得下你需要的代碼,這也是單片機高手所追求的「程序簡潔高效」。當然,初學者不必刻意去追求程序的簡潔高效,主要是要全面地掌握各種指令的應用,只要你對基本指令都熟悉了,那麼你也就可以編出簡潔高效的程序了,不過這編程「內功」是需要你勤學苦練,日積月累的練習、實驗才能達到的哦!馬上拿起你的實驗板,現在就開始動手吧:)
上面我們學習的兩個程序都是比較簡單的流水燈程序,"流水"花樣只能實現單一的"從左到右"流方式。下面介紹一個實用的流水燈程序,程序能夠實現任意方式流水,而且流水花樣無限,只要更改流水花樣數據表的流水數據就可以隨意添加或改變流水花樣,真正實現隨心所欲的流水。只要將下面的程序稍稍修改一下,通過S51增強型單片機實驗板的擴展介面連接到霓虹燈高壓驅動介面板就可以驅動真正的霓虹燈了。
實用的查表方式多功能流水燈程序 liu03.asm
;----- 主程序開始 -----
ORG 0000H ;上電復位,程序從0000H開始執行
START: MOV SP,#60H ;堆棧初始化為60H
MOV DPTR,#LIU_TAB ;流水花樣表首地址送DPTR
LOOP: CLR A
MOVC A,@A+DPTR
CJNE A,#0FFH,SHOW ;檢查流水結束標志
AJMP START ;所有花樣流完,則從頭開始重復流
SHOW: MOV P1,A ;將數據送到P1口
ACALL DELAY
INC DPTR
AJMP LOOP
;----- 延時子程序 -----
DELAY: MOV R0,#255 ;延時一段時間
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ;子程序返回
;----- 下面是流水花樣數據表 -----
LIU_TAB:
DB 01111111B ;二進製表示的流水花樣數據
DB 10111111B
DB 11011111B
DB 11101111B
DB 11110111B
DB 11111011B
DB 11111101B
DB 11111110B
DB 11111110B
DB 11111101B
DB 11111011B
DB 11110111B
DB 11101111B
DB 11011111B
DB 10111111B
DB 01111111B
DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ;十六進製表示
DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
DB 7EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,7EH
DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H
DB 0FFH ;流水花樣結束標志0FFH
END ;程序結束
② armcc hello.c -c -o hello.o是什麼意思
armcc是ARM C編譯器
-c:表示只進行編譯不鏈接文件;
-o<file>:指定編譯器最終生成的輸出文件名。
詳細見:http://blog.sina.com.cn/s/blog_419066f501008dqz.html
③ MDK-arm的ARM編譯工具
ARM編譯工具鏈(之前被稱為ARM RealView編譯工具)包含:
ARM C/C++ 編譯器(armcc)
Microlib
ARM Macro匯編器(armasm)
ARM鏈接器(armLink)
ARM工具(Librarian and FromELF)
基於以上專門針對ARM架構的微控制器編譯器,工程師可以使用C或者C++編寫應用程序。通過以上編譯器的編譯,可以獲得ARM匯編語言的高效率和高速度。
ARM編譯器將C/C++元文件編譯成可重定位(Relocatable)的目標模塊,並且在其中嵌入供uVision調試器或在線調試器調試的符號信息。同時,ARM編譯器能幫助生成listing file,它可以包含symbol table(符號表)和交叉引用信息。
ARM RVCT編譯器被廣泛視為行業最佳的基於ARM架構的編譯器。它定位於最佳代碼密度的編譯器,可以幫助生成代碼量最小的編譯器,幫助節省代碼量對內存的要求從而降低硬體成本。同時,編譯器支持ISO標準的C/C++語言,可以將32-bit ARM, the 16-bit Thumb, 及混合的32/16-bit Thumb2 指令集生成經過高度優化的代碼。
ARM公司一直致力於持續改善ARM編譯器在代碼密度和代碼性能兩方面的性能,同時增添了很多新的特點,如Microlib等。
④ 如何使用arm-linux-gcc交叉編譯器生成map文件
方法/步驟
從網上下載arm-linux-gcc 4.4.3的源碼
進入Linux的終端,將當前目錄設為arm-linux-gcc的下載目錄,輸入tar -xzf arm-linux-gcc-4.4.3.tar.gz,將文件解壓,解壓後會有一個opt的文件夾。
在/usr/local/下建立一個名為arm的文件夾,在終端中輸入命令:cd /usr/local/,回車,然後再輸入命令:mkdir arm,建立arm目錄,並修改該文件夾的屬性為rwx,輸入命令:chmod 777 arm
將之前解壓得到的opt文件壓下的源碼,復制到上一步中創建的arm文件夾下,在終端中輸入命令:sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
到這里已經基本安裝好了,到為了避免每次使用arm-linux-gcc時都要輸入它所在的完整路徑,所以這里我們要修改一下環境變數$PATH。在終端中輸入:sudo gedit /etc/profile,打開profile文件,在最後一行加上「export PATH=$PATH:/usr/local/arm/4.4.3/bin」然後保存文件。
立即使新的環境變數生效,輸入:source /etc/profile。再輸入:echo $PATH查看環境變數,如圖。如果不成功,則直接重新啟動系統,再查看。因為之前我已經安裝過了,為了演示,所以圖中會有兩個/usr/local/arm/4.4.3/bin。
最後檢查是否安裝完成,輸入:arm-linux-gcc -v查看版本信息,如果出現以下信息,則說明安裝成功。
⑤ 為ARM開發的linux驅動程序,應該怎麼編譯得到.o文件
編譯驅動是要和內核相關的,你的這個Mafefile是沒問題,你查查你的/weke/kernel/s3c2410_kernel2.4.18_rel那個內核有沒有交叉編譯過
內核裡面有Makefile,所以你編譯驅動的時候指定內核路徑後,會用編譯內核的交叉編譯工具編譯,然後你試一下make default
⑥ ARM中.c文件和.h文件有什麼區別
其實要理解C文件與頭文件有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:
1.預處理階段
2.詞法與語法分析階段
3.編譯階段,首先編譯成純匯編語句,再將之匯編成跟CPU相關的二進制碼,生成各個目標文件
4.連接階段,將各個目標文件中的各段代碼進行絕對地址定位,生成跟特定平台相關的可執行文件,當然,最後還可以用obj生成純二進制碼,也就是去掉了文件格式信息
編譯器在編譯時是以C文件為單位進行的,也就是說如果你的項目中一個C文件都沒有,那麼你的項目將無法編譯,連接器是以目標文件為單位,它將一個或多個目標文件進行函數與變數的重定位,生成最終的可執行文件,在PC上的程序開發,一般都有一個main函數,這是各個編譯器的約定,當然,你如果自己寫連接器腳本的話,可以不用main函數作為程序入口!!!!
有了這些基礎知識,再言歸正傳,為了生成一個最終的可執行文件,就需要一些目標文件,也就是需要C文件,而這些C文件中又需要一個main函數作為可執行程序的入口,那麼我們就從一個C文件入手,假定這個C文件內容如下:
#include <stdio.h>
#include "mytest.h "
int main(int argc,char **argv)
{
test = 25;
printf( "test.................%d\n ",test);
}
頭文件內容如下:
int test;
現在以這個例子來講解編譯器的工作:
1.預處理階段:編譯器以C文件作為一個單元,首先讀這個C文件,發現第一句與第二句是包含一個頭文件,就會在所有搜索路徑中尋找這兩個文件,找到之後,就會將相應頭文件中再去處理宏,變數,函數聲明,嵌套的頭文件包含等,檢測依賴關系,進行宏替換,看是否有重復定義與聲明的情況發生,最後將那些文件中所有的東東全部掃描進這個當前的C文件中,形成一個中間「C文件」
2.編譯階段,在上一步中相當於將那個頭文件中的test變數掃描進了一個中間C文件,那麼test變數就變成了這個文件中的一個全局變數,此時就將所有這個中間C文件的所有變數,函數分配空間,將各個函數編譯成二進制碼,按照特定目標文件格式生成目標文件,在這種格式的目標文件中進行各個全局變數,函數的符號描述,將這些二進制碼按照一定的標准組織成一個目標文件
3.連接階段,將上一步成生的各個目標文件,根據一些參數,連接生成最終的可執行文件,主要的工作就是重定位各個目標文件的函數,變數等,相當於將個目標文件中的二進制碼按一定的規范合到一個文件中
再回到C文件與頭文件各寫什麼內容的話題上:
理論上來說C文件與頭文件里的內容,只要是C語言所支持的,無論寫什麼都可以的,比如你在頭文件中寫函數體,只要在任何一個C文件包含此頭文件就可以將這個函數編譯成目標文件的一部分(編譯是以C文件為單位的,如果不在任何C文件中包含此頭文件的話,這段代碼就形同虛設),你可以在C文件中進行函數聲明,變數聲明,結構體聲明,這也不成問題!!!那為何一定要分成頭文件與C文件呢?又為何一般都在頭件中進行函數,變數聲明,宏聲明,結構體聲明呢?而在C文件中去進行變數定義,函數實現呢??原因如下:
1.如果在頭文件中實現一個函數體,那麼如果在多個C文件中引用它,而且又同時編譯多個C文件,將其生成的目標文件連接成一個可執行文件,在每個引用此頭文件的C文件所生成的目標文件中,都有一份這個函數的代碼,如果這段函數又沒有定義成局部函數,那麼在連接時,就會發現多個相同的函數,就會報錯
2.如果在頭文件中定義全局變數,並且將此全局變數賦初值,那麼在多個引用此頭文件的C文件中同樣存在相同變數名的拷貝,關鍵是此變數被賦了初值,所以編譯器就會將此變數放入DATA段,最終在連接階段,會在DATA段中存在多個相同的變數,它無法將這些變數統一成一個變數,也就是僅為此變數分配一個空間,而不是多份空間,假定這個變數在頭文件沒有賦初值,編譯器就會將之放入BSS段,連接器會對BSS段的多個同名變數僅分配一個存儲空間
3.如果在C文件中聲明宏,結構體,函數等,那麼我要在另一個C文件中引用相應的宏,結構體,就必須再做一次重復的工作,如果我改了一個C文件中的一個聲明,那麼又忘了改其它C文件中的聲明,這不就出了大問題了,程序的邏輯就變成了你不可想像的了,如果把這些公共的東東放在一個頭文件中,想用它的C文件就只需要引用一個就OK了!!!這樣豈不方便,要改某個聲明的時候,只需要動一下頭文件就行了
4.在頭文件中聲明結構體,函數等,當你需要將你的代碼封裝成一個庫,讓別人來用你的代碼,你又不想公布源碼,那麼人家如何利用你的庫呢?也就是如何利用你的庫中的各個函數呢??一種方法是公布源碼,別人想怎麼用就怎麼用,另一種是提供頭文件,別人從頭文件中看你的函數原型,這樣人家才知道如何調用你寫的函數,就如同你調用printf函數一樣,裡面的參數是怎樣的??你是怎麼知道的??還不是看人家的頭文件中的相關聲明啊!!!當然這些東東都成了C標准,就算不看人家的頭文件,你一樣可以知道怎麼使用
⑦ KEIL MDK編譯器默認生成的文件是什麼格式,ELF還是AXF格式
你這個問題問得有點不對。armcc編譯器默認生成的目標文件是兼容ELF格式的,默認生成的輸出執行文件(已連接為絕對定位)是AXF格式。。
⑧ ARM編譯器與VC++編譯器的區別
arm編譯器編譯出來的是arm處理器執行的二進制文件
而vc編譯出來的是在x86構架windows系統下的可執行文件
區別很大,ads編譯出來的文件是直接面對arm底層硬體的操作,很多系統函數需要自己編寫
而vc中很多類,api函數已經是現成的了,直接調用就可以了
ads中填充0xff,其實在沒有代碼的地址上填充什麼都無所謂,因為程序就不會運行到那個地址上,只是為了讓編寫程序的人清楚這個地方時空的。(個人的感覺,不知道對不對)
vc的編譯我不是很清楚,你再看看其他答案吧。也許和arm的情況差不多
⑨ 有關armcc編譯器的問題
如在如下子目錄中:d:\new\01
可用下述命令:armcc d:\new\01\filename.c
[格式]有多長寫多長,後邊加個:\<文件名>
⑩ 在ARM上運行交叉編譯後的opencv文件,沒有輸出
一、交叉編譯opencv
構造:
下載:各個庫的下載可以直接搜名字到官網下載
幾個關鍵解釋:
「--prefix=」 後邊跟make install時的位置,本例中,libz在make install時將安裝到/usr/arm-linux-gnueabihf中
「--host=」 後邊跟arm-linux表明使用的是ARM環境
有configure的才能進行configure配置
4)所有的makefile修改類似
Libz的交叉編譯
第一步:# ./configure --prefix=/usr/arm-linux-gnueabihf --shared
第二步:修改makefile,主要有下邊幾個,修改的時候通篇參照即可
CC=arm-linux-gnueabihf-gcc
AR=arm-linux-gnueabihf-ar rc
RANLIB=arm-linux-gnueabihf-ranlib
STRIP = arm-linux-gnueabihf-strip
如果有ARCH的話,ARCH=ARM
第三步:#sudo make
#sudo make install
Libjpeg的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static CC=arm-linux-gnueabihf-gcc
第二步:參考1)中方法修改makefile
第三步:#sudo make
#sudo make install
Libpng的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static CC=arm-linux-gnueabihf-gcc
第二步:參考1)中方法修改makefile
第三步:#sudo make
#sudo make install
Yasm的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static
第二步:修改makefile
第三步:#sudo make
#sudo make install
Libx264的交叉編譯
第一步:#CC=arm-linux-gnueabihf-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=/usr/arm-linux-gnueabihf
第二步:修改config.mak里的參數,因為makefile要調用config.mak,所以修改方法同makefile
第三步:#sudo make
#sudo make install
Libxvid的交叉編譯
第一步:首先切換目錄 #cd build/generic
第二步:#./configure --prefix=/usr/arm-linux-gnueabihf --host=arm-linux --disable-assembly
第三步:#sudo make
#sudo make install
ffmpeg的交叉編譯
第一步:
./configure --enable-cross-compile --target-os=linux --cc=arm-linux-gnueabihf-gcc --arch=arm --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-yasm --disable-stripping --enable-libx264 --enable-libxvid --extra-cflags=-I/usr/arm-linux-gnueabihf/include --extra-ldflags=-L/usr/arm-linux-gnueabihf/lib --prefix=/usr/arm-linux-gnueabihf
第二步:修改makefile文件
第三步:#sudo make
#sudo make install
第四步:將ffmpeg加入pkg-config
執行#sudo gedit /etc/bash.bashrc,在末尾加入
export LD_LIBRARY_PATH=/usr/arm-linux-gnueabihf/lib/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/arm-linux-gnueabihf /lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/usr/arm-linux-gnueabihf /lib/
完畢後使用命令:#source /etc/bash.bashrc
或者單獨使用三個export,不過壽命只在一個終端中,終端關閉時就失效。
幾個關鍵解釋:--extra-flags指向xvid的安裝路徑,--extra-ldflags指向x264的路徑
安裝cmake-gui
執行:#sudo apt-get install cmake-qt-gui
Opencv的交叉編譯
第一步:修改opencv/platflrms/linux/目錄下的arm-gnueabi.toolchain.cmake,將其所有刪掉,寫入:
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-linux-gnueabihf-gcc )
set( CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ )
第二步:在opencv目錄下新建build目錄,進入build目錄,執行命令:
#cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake ../
這時,要保證出現:
第三步:使用cmake-gui打開CMakeCache.txt,去掉所有的無關項,修改CMAKE_INSTALL_PREFIX,來確定make install的目錄
第四步:#sudo make
#sudo make install
可能出現的錯誤:
opencv編譯不通過,出現skip之類的,說明ffmpeg沒編譯好,或者其編譯好了,但是pkg-config沒有設置好,一定要設置好其環境
前邊幾步不通過的話,看看命令有沒有少,或者有沒有修改好makefile
在arm上使用時,一種方法時直接將編譯好的opencv目錄下的lib文件拷貝到開發板對應的/lib目錄下,其他或者拷貝到自己指定的目錄,並設置好環境變數即可使用