pl0編譯器
A. cad命令大全
AutoCAD使用技巧
1. 在AutoCAD中有時有交叉點標記在滑鼠點擊處產生,用BLIPMODE命令,在提示行下輸入OFF可消除它。
2. 有的用戶使用AutoCAD時會發現命令中的對話框會變成提示行,如列印命令,控制它的是系統變數CMDDIA,關掉它就行了。
3. 橢圓命令生成的橢圓是以多義線還是以橢圓為實體是由系統變數PELLIPSE決定,當其為1時,生成的橢圓是PLINE。
4. CMDECHO變數決定了命令行回顯是否產生,其在程序執行中應設為0。
5. DIMSCALE決定了尺寸標注的比例,其值為整數,預設為1,在圖形有了一定比例縮放時應最好將其改為縮放比例。
6. BREAK將實體兩點截開,在選取第二點時如用「@」來回答,可由第一點將實體分
7. CAD的較高版本中提供了形位公差標注,但圓度及同軸度中的圓不夠圓,其實,AutoCAD中常見符號定義都在AutoCAD安裝目錄下SUPPORT子目錄下的gdt.shp文件中,其中2號和4號字元定義了圓形的形狀,圓的弧度竟為127°,但不太好改正之(如改為90°更不好看)。
8. 空心漢字字形如使用AutoCADR14中的BONUS功能(一定要完全安裝AutoCAD,或自定義安裝時選了它),有一個TXTEXP命令,可將文本炸為線,對做立體字十分有用。
9. AutoCADR14的BONUS中有一個ARCTEXT命令,可實現弧形文本輸出,使用方法為先選圓弧,再輸入文本內容,按OK。
10. BONUS中還有一個有用的命令,即MPEDIT,用它將多個線一齊修改為多義線,再改它的線寬。
11. image命令在R14中代替了R13中的BMPIN、PCXIN之類命令,它將點陣圖嵌入文件中,只用來顯示,如炸開就成了空框架,如何使PCXIN等命令重現?請將R13安裝目錄下的RASTERIN.EXE拷入R14下,用appload將其裝入,然後就可以將點陣圖導入(可編緝,可炸開)了。
12. BREAK命令用來打斷實體,用戶也可以一點斷開實體,用法是在第一點選擇後,輸入「@」。常用一條線段為點劃線,另一段為實線時。
13. AutoCADR14中提供了大量的命令縮寫,許多R13中無縮寫的命令也有了縮寫,下面提供了CAD中的單字元縮寫:
A:ARC,B:Bmake,C:Circle,D:ddim,E:erase, F:fillet,G:group,H:bhatch,I:ddinsert,L:line, M:move,O:offset,P:pan,R:redraw,S:stretch,
T:mtext,U:undo,V:ddview,W:Wblock,X:explode,Z:zoo。你會發現使用它們比滑鼠點取快(尤其在1s輸5個字元的速度下)。AutoCADR14大量擴充了簡化命令,不僅增加了以首字母簡化的命令(這里不列出),而且增加了用前兩個字母簡化的命令,常用的如:array、、dist、donut、dtext、filter、mirror、pline、rotate、trim、scale、snap、style、units等,更加提高了用鍵盤輸入命令的速度。
14. AutoCADR14的命令縮寫也可用在R13,方法是將AutoCADR14下Support子目錄下的ACAD.pgp拷貝至AutoCADR13的Support子目錄下。
15. AutoCAD中ACAD.pgp文件十分重要,它記錄命令縮寫內容,用戶可自定義它們,格式如下:<命令縮寫>*命令名稱。也可定義系統命令,AutoCADR14提供了sh命令,可執行DOS命令,但在Windows下作用不大。
16. AutoCADR14中用NOTEPAD、EDIT、DIR、DEL等系統命令,筆者認為其中NOTEPAD對自定義CAD用途較大,但使用起來會發現屏幕一閃(進了DOS),又返回,十分讓人不愉快,讓我們來編一個小程序,取名為note.lsp:
(defunc:notepad()
(startapp"notepad")
) 先將ACAD.pgp中的NOTEPAD命令定義行刪除,重入CAD後,再將此程序用命令:(load"note")裝入,下一次用NOTEPAD命令會有更好效果,最好將(load"note")加入Support子目錄下的ACADR14.lsp中。
17. AutoCADR14中列印線寬可由顏色設定,這樣機械制圖中的各種線型不同、線寬不同的線條可放入不同的層,在層中定義了線型和顏色,而在列印設置中設定線型與顏色的關系,效果良好。
18. AutoCADR14的Support中ACAD.dwt為預設模板,要好好加工它,把常用的層、塊、標注類型定義好,再加上標准圖框,可省去大量重復工作。
19. AutoCAD中有不少外部Lisp命令文件,可以直接觀察它們,如果學習開發Lisp應用程序,注意:R14可是最後一版Lisp文件內容公開的AUTOCAD,在CAD2000中Lisp文件內容是加密的(筆者正在研究解密程序)。
20. AutoCAD二次開發工具很多,Lisp早就有了,R11提供了ADS(AcadDevelopsystem),R12中提供了ADS對實模式下C編譯器(如BC,MSC)的支持,R13提供ARX(AcadRuntimeeXtend),R14提供了VBAutomation,這個Automation使VB編寫CAD程序成為可能,渴望CAD編程的人有了一個最好的選擇,不必學習ADS、ARX、ObjectARX,和AutoLisp,一起加入AutoCAD編程的世界。
21. 用戶自定義的Lisp文件一定要自動裝入AutoCAD,這樣就需要在acadr14.lsp中加入用戶Lisp文件的裝入語句,acadr14.lsp(早期版本為acad.lsp),好似DOS的Autoexec.bat,一定要好好利用,在其中如定義了名為S::STARTUP()的函數可自動運行它(給CAD加個啟用畫面如何,可用STARTUP加startapp函數,也可加登錄密碼)。
22. 將AutoCAD中的圖形插入WORD中,有時會發現圓變成了正多邊形,用一下VIEWRES命令,將它設得大一些,可改變圖形質量。
23. 形如f30H11()的標注如何去標注呢,請在文本內容中輸入「%%c30{H11(){\H0.7x;\S+0.1^-0.2;}}」,可以實現,如嫌太麻煩,就編個程序來簡化操作。
24. AutoCAD中文件可當作塊插入其他文件中,但這樣一來過多的塊使文件過於龐大,用PURGE來清除它們吧,一次清一層,一定要多用幾次呀!
25. AutoCADR14的幫助文件內容十分豐富,由很多本「書」組成,一層層打開,多看它們用處是很大的,其中包括了CAD的各方面,比任何CAD大全還全,你是否想您的幫助加入其中,請修改acad.cnt,加入自己幫助的鏈接。
26. 在CAD中可按規定編定.ahp的CAD幫助文件,在R14下用ahp2hlp.exe將其轉變為.hpj的文件和.rtf的文件,再用HelpWorkshop工具(在VC5中有)將其項目打開,編譯為.hlp文件。
27. 在AutoCAD中有一些DOS下的exe文件在R14中仍有用途,用Slidelib.exe可將幻燈片作庫,mc.exe可實現菜單的編譯。
28. 在作完零件圖進行組裝時,可將零件圖塊插入後焊開,再用group成組後組裝,這時用ddselect命令控制組選取處於何種狀態,取消組選取時可將組內成員刪除、剪切、修改,要移動零件時再打開組狀態。
29. 在AutoCAD中的菜單源文件為.mnu文件,將其修改可將自己的命令加入菜單中,再用menu命令裝入,可參加AutoCAD幫助了解菜單文件格式。圖標工具條中加入自己的命令相對簡單,可在工具條上點右鍵,在toolbar對話中,點new按鈕,輸入工具條後,一個新工具條產生,再選Customize按鈕,選定custom,將空按鈕拖入工具條中,再在空按鈕上按右鍵,這樣就可定義自己的按鈕圖標和命令。
30. AutoCAD的狀態行也可自定義,用DIESEL語言可以訪問它,最簡單的方法用modemacro命令,後輸入$(getvar,clayer),以後當前層名就顯示在狀態行上,用戶化可謂無孔不入吧!
31. AutoCAD的圖形格式為.dwg,也可導出為.bmp及.wmf或.eps、.dxf、.3ds,如果用render命令可存為.pcx、.tga、.tif格式,AutoCAD還可將文件直接存為這幾種格式,要為系統裝一個名為「Rasterfileexport」的列印機,用它列印到文件,ACAD2000還可將文件存為JPG格式。
32. render進行著色時,render無關閉按鈕,用戶可用:(arxunload"render"),因為它是ARX文件擴展的功能。
33. dimzin系統變數最好要設定為8,這時尺寸標注中的預設值不會帶幾個尾零,用戶直接接受預設值十分方便快捷。
34. 如遇到快捷鍵失效,如^o失去作用,變為正交模式切換的情況,請用menu將當前使用菜單的.mnu菜單源文件重裝一遍即可。
35. 在多行文字(mtext)命令中使用Word97編輯文本。Mtext多行文字編輯器是AutoCADR14中的新增功能,它提供了Windows文字處理軟體所具備的界面和工作方式,它甚至可以利用Word97的強大功能編輯文本,這一功能可以用如下方法實現:打開「Tools」菜單選「Preferences」命令,「Preferences」對話框彈出後,打開「Files/TextEditor,Dictionary,andFontFileName/TextEditorApplication/Internal」,雙擊「Internal」,出現「Selectafile」對話框,接著找到「Winword.exe」應用程序文件,擊「打開」鈕,最後單擊「OK」返回。完成以上設置後,用戶如再使用mtext命令時系統將自動調用我們熟悉的Word97應用程序,為AutoCAD中的文本錦上添花。
36. 巧用工具按鈕自定義。AutoCAD中有許多lsp文件能為我們提供非常實用的命令,如chtext.lsp就是一個很好的文字修改命令,尤其適用於大批文字的修改,但在使用這樣的命令之前必須先把lsp文件載入。一般你可以通過選取「Tools」菜單中「LoadApplication...」選項,再利用對話框打開AutoCADR14/Support下的Chtext.lsp文件,然後擊「Load」鈕,或者也可以直接在命令行中鍵入「(load「chtext」)」以達到載入的目的,如此做總有些繁瑣。下面我們用自定義工具按鈕的方式解決這個問題,右擊任意工具鈕,彈出「Toolbars」對話框,擊「Customize...」鈕,在「Categories:」中選「Custom」項,將出現的空按鈕拖到工具條中目標位置,擊「Close」鈕返回,接著右擊空按鈕,出現「ButtonProperties」對話框,在「Name:」欄中為命令鈕命名,「Help:」欄中你可寫入或不寫入內容,然後在「Macro:」中鍵入「(load「chtext」)cht」,至於「ButtonIcon",用戶可選系統提供的圖標,也可以點「Edit...」自行繪制或者直接調用已有的bmp文件,最後點「Apply」鈕並依次關閉對話框返回。這樣你自己的工作按鈕就做成了。由於在後面增加了「cht」(注意:前面要有空格),所以你只要按下工具鈕便可以直接去選擇要編輯的目標文件。
37. 「Stretch」命令也是一個常用命令,但輸入命令後,系統總要提示「_windoworcrossing_polygon...」,要求你再輸入一個「C」後才能用滑鼠去選擇目標。為了使操作簡化,用戶只需將系統提供的工具按鈕做些小小的修改即可。右擊任意工具按鈕彈出「Toolbars」對話框,再右擊「stretch」工具鈕彈出「ButtonProporties」對話框,在「Macro:」框中的「^c^c_stretch」後鍵入空格和「C」。以後你再點擊處理後的工具鈕就可以直接選擇目標進行操作。
38. AutoCADR14用戶通常均採用系統給出的預設格式存檔,這種格式存檔的缺點是文件所佔空間大,不能用低版本的應用程序(如:AutoCADR12、AutoCADR13)打開,為避免磁碟空間的浪費,你可以在「SaveDrawingAs」對話框的「保存類型」中選「AutoCADR12/LT2Drawing」格式存檔。例如:同一dwg文件用兩種方式存檔,它們的大小分別是87KB、58KB。可見差別還是很可觀的。而且後者文件可以在R12、R13版本的應用程序中打開。這種方法對配置較低的用戶尤為實用。
39. 有時在打開dwg文件時,系統彈出「AutoCADMessage」對話框提示「Drawingfileisnotvalid」,告訴用戶文件不能打開。這種情況下你可以先退出打開操作,然後打開「File」菜單,選「DrawingUtilities/Recover」命令,或者在命令行直接用鍵盤輸入「recover」,接著在「SelectFile」對話框中輸入要恢復的文件,確認後系統開始執行恢復文件操作。
40. 漢化菜單。將support目錄下的acad.mnu文件復制為chinese.mnu。用寫字板打開chinese.mnu。仔細觀察會發現其中有許多類似「***POP」的條目,每一條目定義了一列下拉菜單。將引號中的英文命令名稱改為中文,存檔退出。再在R14中輸入「menu」命令,將chinese.mnu菜單文件裝入,下拉菜單就變成了中文。還可以再裝入acad.mnu文件將菜單還原。
41. R14默認的「命令取消」鍵是「ESC」鍵,如果你已經習慣了R12的「Ctrl+C」怎麼辦呢?點擊菜單Tools\preferences\compatibility\priorityforacceleratorkeys\autoCADclassic,然後就可以用「Ctrl+C」取消命令了,同時「ESC」鍵仍然有效。
42. trim命令中提示選取要剪切的圖形時,不支持常用的window和crossing選取方式。當要剪切多條線段時,要選取多次才能完成。這時可以使用fence選取方式。當trim命令提示選擇要剪除的圖形時,輸入「f」,然後在屏幕上畫出一條虛線,回車,這時被該虛線接觸到的圖形全部被剪切掉。
43. 單擊「ObjectPropertys」工具條上的「Makeobjects'layercurrent」按鈕,然後在作圖區選擇要去的圖層上的任一圖形,當前層立刻變換到選取的圖形所在層。
44. 用R14打開R12的文件時,即使正確地選擇了漢字字形文件,還是會出現漢字亂碼,原因是R14與R12採用的代碼頁不同。可到AutoDesk公司主頁下載代碼頁轉換工具wnewcp。運行wnewcp後,首先選中「R11/R12」復選框,再單擊「Browse」按鈕,選擇要轉換的文件或目錄,然後選擇新的代碼頁,ANSI936或GB2312均可,單擊「StartConversion」即開始轉換。轉換後,在R14中就能正確地顯示漢字。
1.選擇技巧
在選擇編輯中,有時不小心多選了某個圖元,此時在命令未結束下並不需要取消命令而重來,只須在"選擇目標"的提示後輸入remove回車,再在提示下逐一選擇哪些多選的圖元(當然別太多,否則難選啊!)即可搞定.
在選擇時,隨便輸入兩個字母,如mn,這時你會發現command命令行出現一大串提示,包括fence、wc、wf等,很方便的。
2.AutoCAD裁剪技巧
如圖所示,要對右圖部分圓(可以是其他邊框)外的直線進行裁剪,普通辦法就是選擇裁剪邊界後再選擇要裁剪的線段即可,實際上AutoCAD還有較為簡捷的辦法,其做法如下:
1.按常規執行裁剪命令,選擇裁剪邊界(回車確認);
2.在提示選擇要裁剪的線段元素時輸入「f」(即fence),回車確認;
3.在提示:First Fence point下繪制與要裁剪線段相交的連續橡皮筋直線,回車確認即可(見圖示)。
尚需注意兩點:1.橡皮筋直線無需閉合;2.橡皮筋直線與要裁剪線段重復相交時,則剪去以後一次的部分(這點很重要哦)。
3.選擇技巧
用戶可以用滑鼠一個一個地選擇目標,選擇的目標逐個地添加到選擇集中,另外,AutoCAD還提供了Window(以鍵入「w」響應Select object:或直接在屏幕上自右至左拉一個矩形框響應Select object:提示),Crossing(以鍵入「C」響應Select object:或直接在屏幕上自左至右拉一個矩形框響應Select object:提示),Cpolygon(以鍵入「CP」響應Select object:),Wpolygon(以鍵入「WP」響應Select object:)等多種窗口方式選擇目標,其中Window及Crossing用於矩形窗口,而Wpolygon及Cpolygon用於多邊形窗口,在Window及Wpolygon方式下,只有當實體的所有部分都被包含在窗口時,實體才被選中,而在Crossing及Cpolygon方式下,只要實體的一部分包括在窗口內,實體就被選擇像。AutoCAD還提供了Fence方式(以鍵入「F」響應Select object:)選擇實體,畫出一條不閉合的折線,所有和該折線相交的實體即被選擇。在選擇目標時,有時會不小心選中不該選擇的目標,這時用戶可以鍵入R來響應「select objects:」提示,然後把一些誤選的目標從選擇集中剔除,然後鍵入A,再向選擇集中添加目標。當所選擇實體和別的實體緊挨在一起時可在按住CTRL鍵的同時,然後連續單擊滑鼠左鍵,這時緊挨在一起的實體依次高亮度顯示,直到所選實體高亮度顯示,再按下enter鍵(或單擊滑鼠右鍵),即選擇了該實體。還可以有條件選擇實體,即用'filter響應select objects:,在AutoCAD2000中,還提供了QuickSelect方式選擇實體,功能和filter類似,但操作更簡單,方便。AutoCAD提供的選擇集的構造方法功能很強,靈活恰當地使用可使制圖的效率大大提高。
4.如何在WORD表格中引用ACAD的形位公差?
其實也簡單,但就怕部分新手不敢一試!
1.將ACAD的背景設為白色,否則在WORD中不能處理背景色;
2.在ACAD中單獨直接標注形位公差圖框,盡量放大顯示至整個繪圖區;
3.使用ACAD的clip(拷貝至粘貼板)命令,選中形位公差圖框;
4.切換至WORD的表格中,粘貼即可,但此時整個表格會被擠得很亂,此時可耐點性子,利用WORD自帶的圖片編輯功能將形位公差圖框多餘的邊剪去,並直接拖放形位公差圖框圖片至表格範圍內的合適大小.為利於操作,可將文檔顯示放大。
5.如何給ACAD工具條添加命令及相應圖標
以cad2004為例
cad的工具條並沒有顯示所有可用命令,在需要時用戶要自己添加。
例如繪圖工具條中默認沒有多線命令(mline),就要自己添加。
做法如下:
視圖->工具欄->命令選項卡,選中繪圖右側窗口顯示相應命令
這時找到「多線」,點左鍵把它脫出,若不放到任何已有工具條中,則它以單獨工具條出現;否則成為已有工具條一員。
這時又發現剛拖出的「多線」命令沒有圖標!!就要為他添加圖標。
做法如下:
把命令拖出後,不要關閉自定義窗口,單擊「多線」命令,在彈出的面板的右下角,給它選擇相應的圖標!
這時,我們還可以發現,cad允許我們給每個命令自定義圖標。這樣作個個性化工具條就變得easy了!!
最後,要刪除命令,重復以上操作,把要刪除命令拖回,然後在確認要求中選「是」就行了
以下截圖按操作順序:
6 、變數
一。系統變數
1.如果使用AutoCAD時會發現命令中的對話框會變成提示行,如 列印命 令,控制它的是系統變數CMDDIA,關掉它就行了。
2.橢圓命令生成的橢圓是以多義線還是以橢圓為實體是由系統變數 PELLIPSE決定,當其為1時,生成的橢圓是PLINE。
3.DIMSCALE決定了尺寸標注的比例,其值為整數,預設為1,在圖形 有了一定比例縮放時應最好將其改為縮放比例。
二。操作
1.BREAK將實體兩點截開,在選取第二點時如用「@」來回答,可由 第一點將實體分。
2.AutoCAD R14的BONUS中有一個ARCTEXT命令,可實現弧形文本輸 出,使用方法為先選圓弧,再輸入文本內容,按OK。
3.AutoCAD中文件可當作塊插入其他文件中,但這樣一來過多的塊 使文件過於龐大,用PURGE來清除它們吧,一次清一層,一定要多用 幾次呀!
7.常用快捷鍵,可以提高你的繪圖速度!
F1: 獲取幫助
F2: 實現作圖窗和文本窗口的切換
F3: 控制是否實現對象自動捕捉
F4: 數字化儀控制
F5: 等軸測平面切換
F6: 控制狀態行上坐標的顯示方式
F7: 柵格顯示模式控制
F8: 正交模式控制
F9: 柵格捕捉模式控制
F10: 極軸模式控制
F11: 對象追 蹤式控制
Ctrl+B: 柵格捕捉模式控制(F9)
Ctrl+C: 將選擇的對象復制到剪切板上
Ctrl+F: 控制是否實現對象自動捕捉(f3)
Ctrl+G: 柵格顯示模式控制(F7)
Ctrl+J: 重復執行上一步命令
Ctrl+K: 超級鏈接
Ctrl+N: 新建圖形文件
Ctrl+M: 打開選項對話框
Ctrl+1: 打開特性對話框
Ctrl+2: 打開圖象資源管理器
Ctrl+6: 打開圖象數據原子
Ctrl+ 打開圖象文件
Ctrl+P: 打開列印對說框
Ctrl+S: 保存文件
Ctrl+U: 極軸模式控制(F10)
Ctrl+v: 粘貼剪貼板上的內容
Ctrl+W: 對象追 蹤式控制(F11)
Ctrl+X: 剪切所選擇的內容
Ctrl+Y: 重做
Ctrl+Z: 取消前一步的操作
8.還說一點關於cad圖層的知識
圖層功能給我們管理工程圖帶來的極大的方便,利用他們,我們可以方便的繪制圖形,修改圖形。因此每個新手很有必要掌握圖層方面的知識。
下圖關於每個圖層中線型設置(摘自國家制圖標准)希望大家遵守
9.AutoCAD中如何計算二維圖形的面積:
AutoCAD中,可以方便、准確地計算二維封閉圖形的面積(包括周長),但對於不同類別的圖形,其計算方法也不盡相同。
1. 對於簡單圖形,如矩形、三角形。只須執行命令AREA(可以是命令行輸入或點擊對應命令圖標),在命令提示「Specify first corner point or [Object/Add/Subtract]:」後,打開捕捉依次選取矩形或三角形各交點後回車,AutoCAD將自動計算面積(Area)、周長(Perimeter),並將結果列於命令行。
2. 對於簡單圖形,如圓或其它多段線(Polyline)、樣條線(Spline)組成的二維封閉圖形。執行命令AREA,在命令提示「Specify first corner point or [Object/Add/Subtract]:」後,選擇Object選項,根據提示選擇要計算的圖形,AutoCAD將自動計算面積、周長。
3. 對於由簡單直線、圓弧組成的復雜封閉圖形,不能直接執行AREA命令計算圖形面積。必須先使用Boundary命令(其使用方法依照下圖對話框選擇即刻,它同於剖面線填充的面域創建),以要計算面積的圖形創建一個面域(region)或多段線對象,再執行命令AREA,在命令提示「Specify first corner point or [Object/Add/Subtract]:」後,選擇Object選項,根據提示選擇剛剛建立的面域圖形,AutoCAD將自動計算面積、周長。
10.AutoCAD字體替換技巧
AutoCAD文件在交流過程中,往往會因設計者使用和擁有不同的字體(特別是早期版本必須使用的單線字體),而需為其指定替換字體,如下圖所示,即是因為筆者的電腦中沒有UMHZ.shx字體,而需為其指定筆者電腦中存在的字體hzkt.shx。
這種提示在每次啟動AutoCAD後,打開已有文件都會出現。其實,這種字體替換可以在配置中一次指定:
執行config命令,在下圖對話框的黑顯處(指定替換字體文件)輸入字體文件及其完整目錄,ok後,下次啟動AutoCAD打開已有文件時,字體替換提示將不在出現。
11.如何巧妙使用AutoCAD
1、 十字游標尺寸改變
---- 工程圖繪制時,要按投影規律繪圖。為了便於「長對正,高平齊,寬相等」,繪圖時,可調整十字游標尺寸。即用options命令或選擇下拉菜單 Tools(工具)/ Options(系統配置),打開Options 對話框,找到Display(顯示)選項卡,通過修改Crosshair Size(十字游標大小)區中的游標與屏幕大小的百分比或拖動滑塊,可改變預設值5%,使繪圖窗口十字游標尺寸變大。
2、 畫粗實線
---- 技術制圖國家標准對機械圖樣中的線型有規定。用AutoCAD 2000畫粗實線有多種辦法,最簡便的辦法是使用lweight命令。此命令可在命令行直接鍵入,或選擇下拉菜單Format(格式)/Lineweight(線寬),在出現的對話框中,設置所需線寬,預設線寬為0.25mm,並可用滑塊調整屏幕上線寬顯示比例,該命令為透明命令。也可單擊對象屬性工具欄工具圖標layers,在圖層特性管理對話框中如同設置顏色、線型一樣來設置線寬。因此在繪圖儀出圖時,不用再調整筆寬或線寬。
3、 畫曲線
---- 在繪制圖樣時,經常遇到畫截交線、相貫線及其他曲線的問題。手工繪制很麻煩,要找特殊點和一定數量一般點,且連出的曲線誤差大。用AutoCAD 2000繪制平面曲線或空間曲線卻很容易。
B. Microsoft VBScript 編譯器錯誤 錯誤 '800a0400' 缺少語句
ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件
(0x80040E21)-->sql語句出錯(數據類型不匹配或表名(欄位名)錯誤或表處於編輯狀態,或表不存在於conn打開的資料庫中)
(0x80040E14)-->sql語句出錯(欄位名錯誤,或數據類型不匹配)
(0x80040E07)-->sql語句出錯(要插入或更新的欄位的類型與變數數據類型不匹配)
(0x80040E57)-->sql語句出錯(要插入或更新的數據溢出)
(0x80040E10)-->sql語句出錯(update欄位名或要更新的數據類型錯誤)
(0x80004005)-->sql語句出錯(要插入或更新的欄位的數值不能為空值)
(0x80004005) -->打開資料庫出錯,沒有在指定目錄發現資料庫
(0x80040E37)-->沒有發現表
MicrosoftVBscript運行時錯誤(0x800A000D)-->錯誤引用rs變數(rs對像已關閉或未定義)
MicrosoftVBscript運行時錯誤(0x800A01C2)-->vbscript腳本錯誤(vbscript語句出錯)
MicrosoftVBscript運行時錯誤(0x800A0006)-->vbscript腳本錯誤(溢出錯誤)
MicrosoftVBscript編譯器錯誤(0x800A040E)-->缺少loop
MicrosoftVBscript編譯器錯誤(0x800A03EA)-->缺少if或endif
MicrosoftVBscript編譯器錯誤(0x800A03EE)--> 語句未結束(缺少")")
MicrosoftVBscript編譯器錯誤(0x800A03F6)-->if語句出錯(缺少endif)
MicrosoftVBscript運行時錯誤(0x800A005B)-->缺少set
MicrosoftVBscript運行時錯誤(0x800A0005)-->變數未定義
MicrosoftVBscript編譯器錯誤(0x800A03F9)-->if語句缺少then
MicrosoftVBscript編譯器錯誤(0x800A0411)-->dim語句定義錯誤
MicrosoftVBscript編譯器錯誤(0x800A0408)-->sql語句錯誤(?????????????????)
Microsoft VBScript 運行時錯誤 (0x800A01B6)錯誤原因:set rs=server.create......你少了 set
ADODB.Recordset(0x800A0BB9)-->sql語句出錯(sql語句或conn語句未定義或對一個rs屬性進行賦值時發生錯誤)
ADODB.Recordset(0x800A0CC1)-->rs對像出錯(rs對像本身不存在或錯誤地引用了一個不存在的欄位名)
ADODB.Recordset(0x800A0BCD)-->rs對像出錯(記錄集中沒有記錄卻對記錄集進行操作)
ADODB.Recordset(0x800A0E78)-->rs對像出錯(記錄集不存在,缺少rs.open語句)
ADODB.Recordset(0x800A0CC1) -->rs對像出錯(引用了一個不存在的欄位名)
ADODB.Recordset(0x800A0E7D)-->conn定義錯誤
ADODB.Recordset(0x800A0CB3)-->資料庫以只讀方式打開,無法更新數據
如果 VBScript 語句結構違反了一個或多個 VBScript 腳本語言語法規則,就會產生 VBScript 語法錯誤。
錯誤通常在執行程序前,編譯程序時產生。 以下是53個語法錯誤:
錯誤編號 描述
十進制 十六進制 說明
1001 800A03E9 內存不足
1002 800A03EA 語法錯誤
1003 800A03EB 缺少「:」
1005 800A03ED 需要 '('
1006 800A03EE 需要 ')'
1007 800A03EF 缺少「]」
1010 800A03F2 需要標識符
1011 800A03F3 需要 '='
1012 800A03F4 需要 'If'
1013 800A03F5 需要 'To'
1014 800A03F6 需要 'End'
1015 800A03F7 需要 'Function'
1016 800A03F8 需要 'Sub'
1017 800A03F9 需要 'Then'
1018 800A03FA 需要 'Wend'
1019 800A03FB 需要 'Loop'
1020 800A03FC 需要 'Next'
1021 800A03FD 需要 'Case'
1022 800A03FE 需要 'Select'
1023 800A03FF 需要表達式
1024 800A0400 需要語句
1025 800A0401 需要語句的結束
1026 800A0402 需要整數常數
1027 800A0403 需要 'While' 或 'Until'
1028 800A0404 需要 'While,'、 'Until,' 或語句未結束
1029 800A0405 需要 'With'
1030 800A0406 標識符太長
1031 800A0407 無效的數
1032 800A0408 無效的字元
1033 800A0409 未結束的串常量
1034 800A040A 未結束的注釋
1037 800A040D 無效使用關鍵字 'Me'
1038 800A040E 'loop' 沒有 'do'
1039 800A040F 無效 'exit' 語句
1040 800A0410 無效 'for' 循環控制變數
1041 800A0411 名稱重定義
1042 800A0412 必須為行的第一個語句
1043 800A0413 不能賦給非Byval參數
1044 800A0414 調用 Sub 時不能使用圓括弧
1045 800A0415 需要文字常數
1046 800A0416 需要 'In'
1047 800A0417 需要 'Class'
1048 800A0418 必須在一個類的內部定義
1049 800A0419 在屬性聲明中需要 Let , Set 或 Get
1050 800A041A 需要 'Property'
1051 800A041B 參數數目必須與屬性說明一致
1052 800A041C 在類中不能有多個預設的屬性/方法
1053 800A041D 類初始化或終止不能帶參數
1054 800A041E Property Let 或 Set 至少應該有一個參數
1055 800A041F 不需要的 'Next'
1056 800A0420 只能在 『Property』 或 』Function』 或 』Sub』 上指定 』Default』
1057 800A0421 說明 'Default' 必須同時說明 'Public' "
1058 800A0422 只能在 Property Get 中指定 'Default'
VBScript 運行時錯誤
如果 VBScript 腳本執行系統無法實施的操作,則會產生 VBScript 運行時錯誤。只有在運行腳本、為變數表達式賦值或
分配內存時,才會產生 VBScript 運行時錯誤。 以下是65個運行時錯誤:
錯誤編號 描述
十進制 十六進制 說明
5 800A0005 無效過程調用或參數
6 800A0006 溢出
7 800A0007 內存不足
9 800A0009 下標越界
10 800A000A 該數組為定長的或臨時被鎖定
11 800A000B 被零除
13 800A000D 類型不匹配
14 800A000E 字元串空間溢出
17 800A0011 無法執行請求的操作
28 800A001C 堆棧溢出
35 800A0023 未定義 Sub 或 Function
48 800A0030 載入 DLL 錯誤
51 800A0033 內部錯誤
52 800A0034 壞文件名或數
53 800A0035 文件未找到
54 800A0036 壞文件模式
55 800A0037 文件已經打開
57 800A0039 設備I/O錯誤
58 800A003A 文件已經存在
61 800A003D 磁碟空間已滿
62 800A003E 輸入超出文件尾
67 800A0043 文件太多
68 800A0044 設備不可用
70 800A0046 許可權禁用
71 800A0047 磁碟未准備好
74 800A004A 不能用不同的驅動器重新命名
75 800A004B 路徑/文件訪問錯誤
76 800A004C 路徑未找到
91 800A005B 未設置對象變數
92 800A005C For 循環未初始化
94 800A005E 非法使用 Null
322 800A0142 不能建立所需臨時文件
424 800A01A8 需要對象
429 800A01AD ActiveX 部件無法創建對象
430 800A01AE 類不支持自動化
432 800A01B0 在自動化操作中未找到文件名或類名
438 800A01B6 對象不支持該屬性或方法
440 800A01B8 Automation錯誤
445 800A01BD 對象不支持此操作
446 800A01BE 對象不支持指定的參數
447 800A01BF 對象不支持當前的區域設置
448 800A01C0 未找到命名參數
449 800A01C1 參數不可選
450 800A01C2 錯誤的參數個數或無效的參數屬性值
451 800A01C3 對象不是一個集合
453 800A01C5 指定的dll函數未找到
455 800A01C7 代碼源鎖錯誤
457 800A01C9 這個鍵已經是本集合的一個元素關聯
458 800A01CA 變數使用了一個 VBScript 中不支持的自動化(Automation)類型
462 800A01CE 遠程伺服器不存在或不能訪問
481 800A01E1 無效圖片
500 800A01F4 變數未定義
501 800A01F5 違法的分配
502 800A01F6 腳本對象不安全
503 800A01F7 對象不能安全初始化
504 800A01F8 對象不能安全創建
505 800A01F9 無效的或不合格的引用
506 800A01FA 類未被定義
507 800A01FB 發生異常
5016 800A1398 需要正則表達式對象
5017 800A1399 正則表達式中的語法錯誤
5018 800A139A 錯誤的數量詞
5019 800A139B 在正則表達式中需要 ']'
5020 800A139C 在正則表達式中需要 ')'
5021 800A139D 字元集越界
32811 800A802B 元素未找到
C. MATLAB R2011a 如何安裝編譯器,如何生成exe文件
Matlab編譯器是獨立於matlab主程序的一個模塊,名字叫做Matlab Compliler,你需要找到這個模塊,安裝完畢,才可以使用mcc -m xxx.m 編譯出可執行的exe文件
希望能對你有幫助
D. 類Pcode是什麼
pascal編譯時的中間語言,如果樓主是指這個的話
簡單來說:
PCode是一個基於可視過程,產生Web頁面XML描述文件的一個開發工具。
全面來說:
PCode是一個開發框架和實現該框架的工具,在設計時,它通過一個直觀的、基於描述的設計界面產生頁面外觀,通過一個良好的代碼編輯環境書寫代碼,從而產生純客戶端的XML描述代碼;在運行時,它利用一套基於HTC的封裝GUI組件和自有的XML語法規則,通過一個運行時HTC,解釋設計過程中產生的對頁面的描述,從而生成可視的界面和交互行為;用戶操作頁面時,用戶請求被轉化成XML格式的請求POST到伺服器端,伺服器端處理完成後也僅僅返回XML格式的結果並由客戶端解釋,並反應給用戶。
E. HI-TECH PICC lite V9.60PL0是什麼東西
Microchip公司系列MCU c語言編譯器。
F. MTK的開發環境怎麼搭建
一、開發環境設立
以下表述中提到的相關壓縮包或安裝文件到華禹ftp伺服器下載,部分文件要到群共享裡面下,那裡是最新的。
華禹ftp伺服器:IP:220.113.15.15,帳號為study-bbs.com,密碼為study-bbs0304
P1300的QQ群號: 15762255
P1300_Build_Guide.rar來自ftp伺服器,「華禹\MTK相關部分」目錄下
手機開發板C語言開發視頻.rar來自ftp伺服器,「華禹\MTK相關部分」目錄下
huayu109_ads1.2.rar來自ftp伺服器,「華禹\旋風001手機模塊\1.工具類」目錄下
huayu102_ADS12_Patch_Windows.rar同上
huayu106_perlzip.rar同上
huayu108_SourceInsight3.5.rar同上
huayu101_p1300軟體使用工具及開發指南.rar同上
huayu201_P1300_V1.7_Release.rar文件來自群共享
huayu203_P1300_V1.7_Release_patch.rar文件來自群共享
FlashTool_v3.0844.00.rar文件來自群共享
1、開發主機要求及所需工具:
操作系統:Windows 2000, WinXP. 推薦Windows 2000 with SP2 or later.
編 譯 器:ADS (Arm Developer Suite) v1.2 [Build 842]
Perl解析:ActivePerl, 推薦使用ActivePerl 5.6.1版本
模擬工具:MTK PC Simulator
跟蹤工具:Catcher_L1 v3.10.01,從串口輸出調試信息,只做普通UI應用的話,大致不會用到,用PC模擬工具就好了
燒錄工具:FlashTool_UI v3.1.05 或 FlashTool_v3.0844.00
其他:PL2303_Driver_XP2K v20,這是下載線用到的USB串口驅動,以前機器上裝過PL2303驅動的就不必再裝了
二、開發環境建立過程:
新建一個目錄,英文的好了,否則有些工具不認識中文路徑,這里以E:\MTK_P1300為例說明,下面我用文字和圖片簡單說明下安裝過程,更詳細的安裝過程可以看壓縮文件「手機開發板C語言開發視頻.rar」中的Flash文件「P1300_Build_Env.swf」。
(1)安裝ADS1.2
解壓文件huayu109_ads1.2.rar到某個目錄,比如說解壓到「E:\MTK_P1300」,解壓完後運行「E:\MTK_P1300\ADS1.2\Setup.exe」,一路按下一步,最後安裝License時選定文件「E:\MTK_P1300\ADS1.2\CRACK\ license.dat」,然後接著一路下一步直到安裝完。安裝完後刪掉目錄「E:\MTK_P1300\ADS1.2\」,節省磁碟空間。
(2)安裝ADS補丁
運行huayu102_ADS12_Patch_Windows.rar壓縮文件中的ADS_Patch_Window.exe,這是個自解壓的壓縮文件,選Unzip解壓到上一步ADS的安裝目錄(預設是C:\Program Files\ARM\ADSv1_2),解壓過程中如果問到是否覆蓋,全部選覆蓋好了。
(3)安裝腳本解釋器Perl
直接運行壓縮包huayu106_perlzip.rar裡面擴展名為msi的安裝文件,預設安裝就好,一路Next,呵呵。
上述幾步完成後,編譯環境基本建立,此時可以開一個dos窗(開始菜單->運行->輸入cmd->確定)看一下,安裝正常應該能順利執行以下命令,如下圖:
注意看版本號,應該是ADS1.2 [Build 842],不是的話可能沒打補丁,或補丁打的位置不對,請看第2步ADS補丁部分的說明並重新打一次,直到版本號對為止,哈哈。
這是perl解釋器的運行畫面。
注1:上述安裝過程會自動創建編譯環境所需的環境變數,如果發現編譯不正常了,可能是安裝了其他編譯工具導致沖突,這時建議查看下系統環境變數,把Perl和ADS的安裝目錄調到最前面,同時從path中去掉可能會產生沖突的編譯工具鏈的路徑(例如winavr),如下圖所示(我是安裝到D盤滴,預設是C盤,不過我C盤幾乎被我塞滿了):
如果嫌改path麻煩(因為要用到其他編譯工具鏈的時候還得改回去),還有一種辦法,就是改make.bat批處理,具體見注4中相關說明。
注2: 如果安裝ADS時,改變了默認安裝路徑,需要修改源碼中的設置,源碼目錄樹解壓過程見模擬器編譯環節相關介紹。
1. make\Option.mak
2. ----------------------------------
3. ifeq ($(strip $(COMPILER)),ADS)
4. DIR_ARM= c:\progra~1\arm\adsv1_2 # 修改這里
5. DIR_ARM := $(strip $(DIR_ARM))
6. DIR_TOOL = $(DIR_ARM)\bin
7. DIR_ARMLIB = $(DIR_ARM)\lib
8. DIR_ARMINC = $(DIR_ARM)\include
9. endif
10. ------------------------------------------------
比如改裝到D盤了,這里把紅色部分「c」改成「d」就好了
(4)代碼編輯環境
運行壓縮文件huayu108_Source Insight3.5.rar中的安裝文件安裝即可。至於編輯器,這個看個人喜好了,不過Source Inside看代碼蠻方便的。
(5)PC機模擬器
模擬器MTK PC Simulator是用來在PC上模擬調試用的,要安裝VC6 SP6(同時要安裝Uuicode 靜態和動態庫,沒有裝Unicode庫的可以用「huayu103_MTK模擬器DLL補丁.zip」中的庫,拷到系統目錄「%windir%\system32」下即可)。我機器上的VC是有裝Unicode庫的,沒裝過Unicode庫的如果在模擬器編譯或運行中出現問題,建議重裝下VC6,安裝時勾選Unicode庫,並打上相關補丁到SP6。
模擬器能模擬真機的大部分行為,這樣能給調試帶來很大便利,不需要每次改動都要燒錄。
模擬器要從源碼編譯,解壓壓縮包「huayu201_P1300_V1.7_Release.rar」裡面的文件「HUAYU_P1300_V1.7_Release.rar」到目錄「E:\MTK_P1300」,此時會出現目錄「E:\MTK_P1300\P1300_V1.7_Release」,這就是P1300的代碼目錄樹了;接著打上最新的補丁,解壓壓縮包「huayu203_P1300_V1.7_Release_patch.rar」裡面的壓縮文件「HUAYU_P1300_V1.7_Release_patch.rar」到目錄
「E:\MTK_P1300\P1300_V1.7_Release」,解壓時選擇全覆蓋以替換被修改過的文件,打補丁之前對目錄樹裡面的文件進行修改過的,需要手動再加上去。
編譯PC模擬器之前需要先把剛才上面得到的目錄樹build一次,開一個dos窗,盤符和目錄轉到代碼目錄樹對應的盤符和目錄,例如:
1. E:
2. cd E:\MTK_P1300\P1300_V1.7_Release\
3. make new
注3:第一次make的時候要用「make new」,make new的時間比較長(慢的機器搞不好要2小時以上),編譯過程中間會出現一些文件找不到的信息,只要編譯過程沒意外終止,那些信息可以忽略。編譯日誌文件位置: build\NEOTEL25_06B\log\,要查看編譯過程有啥問題就看這個目錄下的文件了;生成的bin文件位置: build\NEOTEL25_06B\*.bin,下載燒錄就是燒bin文件。
這里順帶介紹下build的命令格式:
make new 清除後重新編譯整個項目
make resgen 重新生成資源
make remake重新編譯鏈接項目
make viewlog xxx 查看模塊xxx的編譯日誌
make查看可以用make選項幫助信息
注4:如果機器上裝了其他gcc編譯工具鏈(比如winavr之類)的話可能要手動改下Path,否則編譯會出錯,修改Path的方法見注1,也可以修改批處理文件「E:\MTK_P1300\P1300_V1.7_Release\make.bat」,在「perl make2.pl %*」之前加上下面兩句:
1. set PERL5LIB=D:\perl\lib
2. set PATH=D:\perl\bin;d:\progra~1\arm\adsv1_2\bin;E:\MTK_P1300\P1300_V1.7_Release\tools;c:\windows\system32;c:\windows;c:\windows\system
注意,上面的路徑是我機器上的,不是預設安裝路徑,要根據自己的實際安裝路徑做修改。
下面開始編譯PC模擬器了,用VC6打開工程文件「E:\MTK_P1300\P1300_V1.7_Release\plutommi\mmi\ PC_Simulator.dsw」,然後開始編譯,編譯時間比較長,具體看機器配置了,這時又可以干點別的啥了,呵呵。
因為模擬器工程涉及文件較多,編譯費時,建議編譯過程中電腦上少開窗口,特別是網路類的,如QQ,有時會發現開QQ後,編譯過程中VC會掛死,呵呵。有可能是開QQ後防火牆過濾網路數據佔用較多系統資源,如果發現VC編譯特別慢或乾脆掛死,可以重啟動一下電腦,只開必要的窗口,然後開始編譯。
如果編譯過程中發現怪異的問題,如:
1. incomingstringiddef.h(120) : error C2059: syntax error : 'constant'
2. 或者
3. error C2065: 'STR_CM_REDIAL' : undeclared identifier
4. 之類
5.
這個時侯你可能需要看一下你VC相關路徑的設置順序,如下圖:
把VC原本的頭文件路徑調整到最前面,我剛開始編譯的時候SDK的頭文件在前面,編譯總是通不過,改一下就好了,庫也一樣都調整下比較保險,呵呵。
(6)Tracer跟蹤工具
解壓文件P1300_Build_Guide.rar到E:\MTK_P1300,然後在文件管理器進入目錄「E:\MTK_P1300\P1300_Build_Guide」,接著解壓Catcher_L1_v3.10.01.zip到當前目錄下的Catcher_L1_v3.10.01子目錄,進入子目錄Catcher_L1_v3.10.01,發送一個Catcher.exe的快捷方式到桌面。
在需要用到TRACE的時候,在代碼中使用函數
void kal_prompt_trace(mole_type mod_id, const kal_char *fmt,...); 列印需要查看的信息,使用Catcher跟蹤查看。
這個有點類似linux的Kernel Debug工具,具體使用方法見文檔《cather使用手冊.doc》,這個文檔可在壓縮包「huayu101_p1300軟體使用工具及開發指南.rar」裡面找到。
(7)燒錄工具
解壓文件「E:\MTK_P1300\P1300_Build_Guide\ FlashTool_UI_exe_v3.1.05.zip」到當前目錄,然後進入目錄「E:\MTK_P1300\P1300_Build_Guide\FlashTool_v3.1.05」,發送一個Flash_tool.exe的快捷方式到桌面好了。
還有個下載工具FlashTool_v3.0844.00.rar,也是不用安裝,解壓後直接用的,據說燒錄速度比上面那個快。
具體使用方法見文檔《flash_tool_MT平台使用教程.doc》,這個文檔可在壓縮包「huayu101_p1300軟體使用工具及開發指南.rar」裡面找到。
(8)USB串口下載線驅動
運行壓縮文件
1. 「E:\MTK_P1300\P1300_Build_Guide\ PL2303_Driver_XP2K_v20.zip」
裡面的可執行文件進行安裝,一路下一步,這里不再贅述。
nucleus實時操作系統MTK手機軟體系統工程和配置簡介
MTK使用了nucleus實時操作系統,在其上做了個內核抽象層的封裝,以適應多種實時操作系統,如oscar、ThreadX、nucleus。整個軟體系統包括nucleus操作系統、平台設備驅動、協議棧、文件系統、WGUI、MMI、J2ME等。在這里MMI部分幾乎包括了操作系統內核、協議棧、文件系統之上的所有部分,其中WGUI也在其中。
MTK的PC模擬版使用VC的編譯器和鏈接器生成,ARM版使用ADS1.2的編譯器和鏈接器生成。因為MTK的整個軟體系統是一個很龐大而且復雜的工程,並且要支持多個MTK的產品系列和多家客戶的客戶化支持,使用集成開發環境(IDE)已經無法勝任,而且很難做到整個工程的自動構建和資源、代碼的生成。所以MTK的軟體系統使用了windows下的GNU開發工具鏈(MinGW)來進行工程的管理、配置和構建,MTK將MinGW放到了第三方工具中。
另外還使用了perl腳本來解析用戶輸入的命令行參數,因此第三方工具中還包含了ActivePerl(windows下的perl解釋器)。不過,整個軟體系統並沒有使用MinGW的全部工具,好象只使用了make這個工具,由幾個Makefile控制了構建的過程,在編譯和鏈接時根據最終生成PC模擬版還是ARM版而分別調用VC的編譯器和鏈接器或ADS1.2的編譯器和鏈接器。
G. 求一個c語言編寫的pl0編譯器
// pl0 compiler source code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "set.h"
#include "pl0.h"
//////////////////////////////////////////////////////////////////////
// print error message.
void error(n)
{
int i;
printf(" ");
for (i = 1; i <= cc - 1; i++)
printf(" ");
fprintf(outfile, " ");
fprintf(outfile, "^\n");
printf("^\n");
fprintf(outfile, "Error %3d: %s\n", n, err_msg[n]);
printf("Error %3d: %s\n", n, err_msg[n]);
err++;
} // error
//////////////////////////////////////////////////////////////////////
void getch(void)
{
if (cc == ll)
{
if (feof(infile))
{
printf("\nPROGRAM INCOMPLETE\n");
exit(1);
}
ll = cc = 0;
fprintf(outfile, "%5d ", cx);
printf("%5d ", cx);
while ( (!feof(infile)) // added & modified by alex 01-02-09
&& ((ch = getc(infile)) != '\n'))
{
fprintf(outfile, "%c", ch);
printf("%c", ch);
line[++ll] = ch;
} // while
fprintf(outfile, "\n");
printf("\n");
line[++ll] = ' ';
}
ch = line[++cc];
} // getch
//////////////////////////////////////////////////////////////////////
// gets a symbol from input stream.
void getsym(void)
{
int i, k;
char a[MAXIDLEN + 1];
while (ch == ' '|| ch == '\t')
// modified by yzhang 02-03-12,add some white space
getch();
if (isalpha(ch))
{ // symbol is a reserved word or an identifier.
k = 0;
do
{
if (k < MAXIDLEN)
a[k++] = ch;
getch();
}
while (isalpha(ch) || isdigit(ch));
a[k] = 0;
strcpy(id, a);
word[0] = id;
i = NRW;
while (strcmp(id, word[i--]));
if (++i)
sym = wsym[i]; // symbol is a reserved word
else
sym = SYM_IDENTIFIER; // symbol is an identifier
}
else if (isdigit(ch))
{ // symbol is a number.
k = num = 0;
sym = SYM_NUMBER;
do
{
num = num * 10 + ch - '0';
k++;
getch();
}
while (isdigit(ch));
if (k > MAXNUMLEN)
error(25); // The number is too great.
}
else if (ch == ':')
{
getch();
if (ch == '=')
{
sym = SYM_BECOMES; // :=
getch();
}
else
{
sym = SYM_NULL; // illegal?
}
}
else if (ch == '>')
{
getch();
if (ch == '=')
{
sym = SYM_GEQ; // >=
getch();
}
else
{
sym = SYM_GTR; // >
}
}
else if (ch == '<')
{
getch();
if (ch == '=')
{
sym = SYM_LEQ; // <=
getch();
}
else if (ch == '>')
{
sym = SYM_NEQ; // <>
getch();
}
else
{
sym = SYM_LES; // <
}
}
else
{ // other tokens
i = NSYM;
csym[0] = ch;
while (csym[i--] != ch);
if (++i)
{
sym = ssym[i];
getch();
}
else
{
printf("Fatal Error: Unknown character.\n");
fprintf(outfile, "Fatal Error: Unknown character.\n");
exit(1);
}
}
} // getsym
//////////////////////////////////////////////////////////////////////
// generates (assembles) an instruction.
void gen(int x, int y, int z)
{
if (cx > CXMAX)
{
fprintf(outfile, "Fatal Error: Program too long.\n");
printf("Fatal Error: Program too long.\n");
exit(1);
}
code[cx].f = x;
code[cx].l = y;
code[cx++].a = z;
} // gen
//////////////////////////////////////////////////////////////////////
// tests if error occurs and skips all symbols that do not belongs to s1 or s2.
void test(symset s1, symset s2, int n)
{
symset s;
if (! inset(sym, s1))
{
showset(s1);
showset(s2);
printf("sym=%d, id=%s\n", sym, id);
error(n);
s = uniteset(s1, s2);
while(! inset(sym, s))
getsym();
destroyset(s);
}
} // test
//////////////////////////////////////////////////////////////////////
int dx; // data allocation index
// enter object(constant, variable or procedre) into table.
void enter(int kind)
{
mask* mk;
// added by yzhang 02-02-28
if ( position(id)> 0 ){
error(26); //Redeclared identifier.
}
// end
tx++;
strcpy(table[tx].name, id);
table[tx].kind = kind;
switch (kind)
{
case ID_CONSTANT:
if (num > MAXADDRESS)
{
error(25); // The number is too great.
num = 0;
}
table[tx].value = num;
break;
case ID_VARIABLE:
mk = (mask*) &table[tx];
mk->level = level;
mk->address = dx++;
break;
case ID_PROCEDURE:
mk = (mask*) &table[tx];
mk->level = level;
break;
} // switch
} // enter
//////////////////////////////////////////////////////////////////////
// locates identifier in symbol table.
int position(char* id)
{
int i;
strcpy(table[0].name, id);
i = tx + 1;
while (strcmp(table[--i].name, id) != 0);
return i;
} // position
//////////////////////////////////////////////////////////////////////
void constdeclaration()
{
if (sym == SYM_IDENTIFIER)
{
getsym();
if (sym == SYM_EQU || sym == SYM_BECOMES)
{
if (sym == SYM_BECOMES)
error(1); // Found ':=' when expecting '='.
getsym();
if (sym == SYM_NUMBER)
{
enter(ID_CONSTANT);
getsym();
}
else
{
error(2); // There must be a number to follow '='.
}
}
else
{
error(3); // There must be an '=' to follow the identifier.
}
}
else //added by yzhang 02-02-28
error(4); // There must be an identifier to follow 'const', 'var', or 'procere'.
} // constdeclaration
//////////////////////////////////////////////////////////////////////
void vardeclaration(void)
{
if (sym == SYM_IDENTIFIER)
{
enter(ID_VARIABLE);
getsym();
}
else
{
error(4); // There must be an identifier to follow 'const', 'var', or 'procere'.
}
} // vardeclaration
//////////////////////////////////////////////////////////////////////
void listcode(int from, int to)
{
int i;
printf("\n");
fprintf(outfile, "\n");
for (i = from; i < to; i++)
{
printf("%5d %s\t%d\t%d\n", i, mnemonic[code[i].f], code[i].l, code[i].a);
fprintf(outfile, "%5d %s\t%d\t%d\n", i, mnemonic[code[i].f], code[i].l, code[i].a);
}
printf("\n");
fprintf(outfile, "\n");
} // listcode
//////////////////////////////////////////////////////////////////////
void factor(symset fsys)
{
void expression();
int i;
symset set;
test(facbegsys, fsys, 24); // The symbol can not be as the beginning of an expression.
while (inset(sym, facbegsys))
{
if (sym == SYM_IDENTIFIER)
{
if ((i = position(id)) == 0)
{
error(11); // Undeclared identifier.
}
else
{
switch (table[i].kind)
{
mask* mk;
case ID_CONSTANT:
gen(LIT, 0, table[i].value);
break;
case ID_VARIABLE:
mk = (mask*) &table[i];
gen(LOD, level - mk->level, mk->address);
break;
case ID_PROCEDURE:
error(21); // Procere identifier can not be in an expression.
break;
} // switch
}
getsym();
}
else if (sym == SYM_NUMBER)
{
if (num > MAXADDRESS)
{
error(25); // The number is too great.
num = 0;
}
gen(LIT, 0, num);
getsym();
}
else if (sym == SYM_LPAREN)
{
getsym();
set = uniteset(createset(SYM_RPAREN, SYM_NULL), fsys);
expression(set);
destroyset(set);
if (sym == SYM_RPAREN)
{
getsym();
}
else
{
error(22); // Missing ')'.
}
}
else // added by yzhang 02-02-28
test(fsys, createset(SYM_LPAREN, SYM_NULL), 23);
} // while
} // factor
//////////////////////////////////////////////////////////////////////
void term(symset fsys)
{
int mulop;
symset set;
set = uniteset(fsys, createset(SYM_TIMES, SYM_SLASH, SYM_NULL));
factor(set);
while (sym == SYM_TIMES || sym == SYM_SLASH)
{
mulop = sym;
getsym();
factor(set);
if (mulop == SYM_TIMES)
{
gen(OPR, 0, OPR_MUL);
}
else
{
gen(OPR, 0, OPR_DIV);
}
} // while
destroyset(set);
} // term
//////////////////////////////////////////////////////////////////////
void expression(symset fsys)
{
int addop;
symset set;
set = uniteset(fsys, createset(SYM_PLUS, SYM_MINUS, SYM_NULL));
if (sym == SYM_PLUS || sym == SYM_MINUS)
{
addop = sym;
getsym();
term(set);
if (addop == SYM_MINUS)
{
gen(OPR, 0, OPR_NEG);
}
}
else
{
term(set);
}
while (sym == SYM_PLUS || sym == SYM_MINUS)
{
addop = sym;
getsym();
term(set);
if (addop == SYM_PLUS)
{
gen(OPR, 0, OPR_ADD);
}
else
{
gen(OPR, 0, OPR_MIN);
}
} // while
destroyset(set);
} // expression
//////////////////////////////////////////////////////////////////////
void condition(symset fsys)
{
int relop;
symset set;
if (sym == SYM_ODD)
{
getsym();
expression(fsys);
gen(OPR, 0, 6);
}
else
{
set = uniteset(relset, fsys);
expression(set);
destroyset(set);
if (! inset(sym, relset))
{
error(20);
}
else
{
relop = sym;
getsym();
expression(fsys);
switch (relop)
{
case SYM_EQU:
gen(OPR, 0, OPR_EQU);
break;
case SYM_NEQ:
gen(OPR, 0, OPR_NEQ);
break;
case SYM_LES:
gen(OPR, 0, OPR_LES);
break;
case SYM_GEQ:
gen(OPR, 0, OPR_GEQ);
break;
case SYM_GTR:
gen(OPR, 0, OPR_GTR);
break;
case SYM_LEQ:
gen(OPR, 0, OPR_LEQ);
break;
} // switch
} // else
} // else
} // condition
//////////////////////////////////////////////////////////////////////
void statement(symset fsys)
{
int i, cx1, cx2;
symset set1, set;
if (sym == SYM_IDENTIFIER)
{ // variable assignment
mask* mk;
if (! (i = position(id)))
{
error(11); // Undeclared identifier.
}
else if (table[i].kind != ID_VARIABLE)
{
error(12); // Illegal assignment.
i = 0;
}
getsym();
if (sym == SYM_BECOMES)
{
getsym();
}
else
{
error(13); // ':=' expected.
}
expression(fsys);
mk = (mask*) &table[i];
if (i)
{
gen(STO, level - mk->level, mk->address);
}
}
else if (sym == SYM_CALL)
{ // procere call
getsym();
if (sym != SYM_IDENTIFIER)
{
error(14); // There must be an identifier to follow the 'call'.
}
else
{
if (! (i = position(id)))
{
error(11); // Undeclared identifier.
}
else if (table[i].kind == ID_PROCEDURE)
{
mask* mk;
mk = (mask*) &table[i];
gen(CAL, level - mk->level, mk->address);
}
else
{
error(15); // A constant or variable can not be called.
}
getsym();
} // else
}
else if (sym == SYM_IF)
{ // if statement
getsym();
set1 = createset(SYM_THEN, SYM_DO, SYM_NULL);
set = uniteset(set1, fsys);
condition(set);
destroyset(set1);
destroyset(set);
if (sym == SYM_THEN)
{
getsym();
}
else
{
error(16); // 'then' expected.
}
cx1 = cx;
gen(JPC, 0, 0);
statement(fsys);
code[cx1].a = cx;
}
else if (sym == SYM_BEGIN)
{ // block
getsym();
set1 = createset(SYM_SEMICOLON, SYM_END, SYM_NULL);
set = uniteset(set1, fsys);
statement(set);
while (sym == SYM_SEMICOLON || inset(sym, statbegsys))
{
if (sym == SYM_SEMICOLON)
{
getsym();
}
else
{
error(10);
}
statement(set);
} // while
destroyset(set1);
destroyset(set);
if (sym == SYM_END)
{
getsym();
}
else
{
error(17); // ';' or 'end' expected.
}
}
else if (sym == SYM_WHILE)
{ // while statement
cx1 = cx;
getsym();
set1 = createset(SYM_DO, SYM_NULL);
set = uniteset(set1, fsys);
condition(set);
destroyset(set1);
destroyset(set);
cx2 = cx;
gen(JPC, 0, 0);
if (sym == SYM_DO)
{
getsym();
}
else
{
error(18); // 'do' expected.
}
statement(fsys);
gen(JMP, 0, cx1);
code[cx2].a = cx;
}
else //added by yzhang 02-02-28
test(fsys, phi, 19);
} // statement
//////////////////////////////////////////////////////////////////////
void block(symset fsys)
{
int cx0; // initial code index
mask* mk;
int block_dx;
int savedTx;
symset set1, set;
dx = 3;
block_dx = dx;
mk = (mask*) &table[tx];
mk->address = cx;
gen(JMP, 0, 0);
if (level > MAXLEVEL)
{
error(32); // There are too many levels.
}
do
{
if (sym == SYM_CONST)
{ // constant declarations
getsym();
do
{
constdeclaration();
while (sym == SYM_COMMA)
{
getsym();
constdeclaration();
}
if (sym == SYM_SEMICOLON)
{
getsym();
}
else
{
error(5); // Missing ',' or ';'.
}
}
while (sym == SYM_IDENTIFIER);
} // if
if (sym == SYM_VAR)
{ // variable declarations
getsym();
do
{
vardeclaration();
while (sym == SYM_COMMA)
{
getsym();
vardeclaration();
}
if (sym == SYM_SEMICOLON)
{
getsym();
}
else
{
error(5); // Missing ',' or ';'.
}
}
while (sym == SYM_IDENTIFIER);
block_dx = dx; // modified by yzhang 02-03-15
} // if
while (sym == SYM_PROCEDURE)
{ // procere declarations
getsym();
if (sym == SYM_IDENTIFIER)
{
enter(ID_PROCEDURE);
getsym();
}
else
{
error(4); // There must be an identifier to follow 'const', 'var', or 'procere'.
}
if (sym == SYM_SEMICOLON)
{
getsym();
}
else
{
error(5); // Missing ',' or ';'.
}
level++;
savedTx = tx;
set1 = createset(SYM_SEMICOLON, SYM_NULL);
set = uniteset(set1, fsys);
block(set);
destroyset(set1);
destroyset(set);
tx = savedTx;
level--;
if (sym == SYM_SEMICOLON)
{
getsym();
set1 = createset(SYM_IDENTIFIER, SYM_PROCEDURE, SYM_NULL);
set = uniteset(statbegsys, set1);
test(set, fsys, 6);
destroyset(set1);
destroyset(set);
}
else
{
error(5); // Missing ',' or ';'.
}
} // while
set1 = createset(SYM_IDENTIFIER, SYM_NULL);
set = uniteset(statbegsys, set1);
test(set, declbegsys, 7);
destroyset(set1);
destroyset(set);
}
while (inset(sym, declbegsys));
code[mk->address].a = cx;
mk->address = cx;
cx0 = cx;
gen(INT, 0, block_dx);
set1 = createset(SYM_SEMICOLON, SYM_END, SYM_NULL);
set = uniteset(set1, fsys);
statement(set);
destroyset(set1);
destroyset(set);
gen(OPR, 0, OPR_RET); // return
test(fsys, phi, 8); // test for error: Follow the statement is an incorrect symbol.
listcode(cx0, cx);
} // block
//////////////////////////////////////////////////////////////////////
int base(int stack[], int currentLevel, int levelDiff)
{
int b = currentLevel;
while (levelDiff--)
b = stack[b];
return b;
} // base
//////////////////////////////////////////////////////////////////////
// interprets and executes codes.
void interpret()
{
int pc; // program counter
int stack[STACKSIZE];
int top; // top of stack
int b; // program, base, and top-stack register
instruction i; // instruction register
printf("Begin executing PL/0 program.\n");
fprintf(outfile, "Begin executing PL/0 program.\n");
pc = 0;
b = 1;
top = 3;
stack[1] = stack[2] = stack[3] = 0;
do
{
i = code[pc++];
switch (i.f)
{
case LIT:
stack[++top] = i.a;
break;
case OPR:
switch (i.a) // operator
{
case OPR_RET:
top = b - 1;
pc = stack[top + 3];
b = stack[top + 2];
break;
case OPR_NEG:
stack[top] = -stack[top];
break;
case OPR_ADD:
top--;
stack[top] += stack[top + 1];
break;
case OPR_MIN:
top--;
stack[top] -= stack[top + 1];
break;
case OPR_MUL:
top--;
stack[top] *= stack[top + 1];
break;
case OPR_DIV:
top--;
if (stack[top + 1] == 0)
{
fprintf(stderr, "Runtime Error: Divided by zero.\n");
fprintf(stderr, "Program terminated.\n");
continue;
}
stack[top] /= stack[top + 1];
break;
case OPR_ODD:
stack[top] %= 2;
break;
case OPR_EQU:
top--;
stack[top] = stack[top] == stack[top + 1];
break;
case OPR_NEQ:
top--;
stack[top] = stack[top] != stack[top + 1];
case OPR_LES:
top--;
stack[top] = stack[top] < stack[top + 1];
break;
case OPR_GEQ:
top--;
stack[top] = stack[top] >= stack[top + 1];
case OPR_GTR:
top--;
stack[top] = stack[top] > stack[top + 1];
break;
case OPR_LEQ:
top--;
stack[top] = stack[top] <= stack[top + 1];
} // switch
break;
case LOD:
stack[++top] = stack[base(stack, b, i.l) + i.a];
break;
case STO:
stack[base(stack, b, i.l) + i.a] = stack[top];
//printf("%d\n", stack[top]);
fprintf(outfile, "%d\n", stack[top]);
top--;
break;
case CAL:
stack[top + 1] = base(stack, b, i.l);
// generate new block mark
stack[top + 2] = b;
stack[top + 3] = pc;
b = top + 1;
pc = i.a;
break;
case INT:
top += i.a;
break;
case JMP:
pc = i.a;
break;
case JPC:
if (stack[top] == 0)
pc = i.a;
top--;
break;
} // switch
}
while (pc);
//printf("End executing PL/0 program.\n");
fprintf(outfile, "End executing PL/0 program.\n");
} // interpret
//////////////////////////////////////////////////////////////////////
void main ()
{
FILE* hbin;
char s[80],*finddot;
int i;
symset set, set1, set2;
printf("Please input source file name: "); // get file name to be compiled
scanf("%s", s);
if ((infile = fopen(s, "r")) == NULL)
{
printf("File %s can't be opened.\n", s);
exit(1);
}
#if 1 // added by yzhang 02-02-28
// open the output file
finddot = strchr(s,'.');
if (finddot!=NULL){
strcpy(finddot, ".out");
}else{
strcat(s, ".out");
printf("%s\n", s);
}
printf("Output File is %s\n", s);
if ((outfile = fopen(s, "w")) == NULL)
{
printf("File %s can't be opened.\n", s);
exit(1);
}
#endif
phi = createset(SYM_NULL);
relset = createset(SYM_EQU, SYM_NEQ, SYM_LES, SYM_LEQ, SYM_GTR, SYM_GEQ, SYM_NULL);
// create begin symbol sets
declbegsys = createset(SYM_CONST, SYM_VAR, SYM_PROCEDURE, SYM_NULL);
statbegsys = createset(SYM_BEGIN, SYM_CALL, SYM_IF, SYM_WHILE, SYM_NULL);
facbegsys = createset(SYM_IDENTIFIER, SYM_NUMBER, SYM_LPAREN, SYM_NULL);
err = cc = cx = ll = 0; // initialize global variables
ch = ' ';
kk = MAXIDLEN;
getsym();
set1 = createset(SYM_PERIOD, SYM_NULL);
set2 = uniteset(declbegsys, statbegsys);
set = uniteset(set1, set2);
block(set);
destroyset(set1);
destroyset(set2);
destroyset(set);
destroyset(phi);
destroyset(relset);
destroyset(declbegsys);
destroyset(statbegsys);
destroyset(facbegsys);
if (sym != SYM_PERIOD)
error(9); // '.' expected.
if (err == 0)
{
hbin = fopen("hbin.txt", "w");
for (i = 0; i < cx; i++)
fwrite(&code[i], sizeof(instruction), 1, hbin);
fclose(hbin);
}
if (err == 0)
interpret();
else
printf("There are %d error(s) in PL/0 program.\n", err);
listcode(0, cx);
// close all files, added by yzhang, 02-02-28
fclose(infile);
fclose(outfile);
} // main
//////////////////////////////////////////////////////////////////////
// eof pl0.c
H. android native application沒有
為了給Android編譯程序,你需要ARM工具鏈(toolchain). 我發現有兩種主張,分別是使用Android Prebuild toolchain和CodeSourcery
1)Android Prebuild toolchain
Android沒有使用傳統的libc庫.相反,它用了Bionic庫,一個由Google開發的,用在Android移動軟體平台上的輕量級的libc
Bionic被裁剪到只支持 Android系統.請看 六百萬美元的c程序庫
2)CodeSourcery
CodeSourcery是ARM的合作夥伴.專門為ARM處理器開發增強GUN工具鏈的,並提供驗證過的GNU工具鏈.這些工具鏈有很多不同的版本.
對於Android平台,需要 arm-none-linux-gnueabi,而arm-none-eabi是沒有glibc包含在裡面的,主要面向那些編譯完整的native庫和應用(比如FreeRTOS)
譯者注: arm-none-eabi就是用來編譯裸機程序的,請參考 最簡單的ARM裸機程序
我個人的觀點,如果白手起家開始創建一個Android的應用程序,你應該選擇Bionic.
但是如果你選擇從你的PC環境移植一個庫到Android,你應該選擇CodeSourcery
如果你使用到線程或者C++異常,Bionic庫也不能完全支持它們(實際上,它根本就不支持異常)
agcc.pl是Andrew Ross開發的一個腳本,讓你以一種很簡單的方法來自動包含常用的庫,使用Android的ARM工具鏈gcc
某種程度上,他像makefile
第1種方法使用Makefile和Android NDK
AR = arm-linux-androideabi-ar
AS = arm-linux-androideabi-as
CC = arm-linux-androideabi-gcc
CXX = arm-linux-androideabi-g++
LD = arm-linux-androideabi-ld.gold
NDK_KIT = /home/tim/android-ndk-r10b
PLATF_KIT = platforms/android-9
ARM_INC = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/include
ARM_LIB = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/lib
OBJS = hello.o
EXES = hello
hello : hello.o
$(LD) --dynamic-linker=/system/bin/linker -nostdlib \
-rpath-link=$(ARM_LIB) \
$(ARM_LIB)/crtbegin_dynamic.o \
-L$(ARM_LIB) -lc \
-o hello hello.o
hello.o: hello.c
$(CC) -I $(ARM_INC) -c hello.c
clean:
rm -f $(OBJS) $(EXES)
源代碼
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello Android\n");
return 0;
}
設置環境變數 envsetup.sh
export PATH=$PATH:/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin
最後,運行 make 就可以了
關於 -rpath-link選項,請參考 gcc鏈接選項第二種簡單方法,使用shell腳本
#!/bin/sh
OS='linux'
ANDROIDSDK='android-14'
PROGDIR='/home/tim/android-ndk-r10b/'
PROGDIR=`cd $PROGDIR && pwd`
ARMEABIGCC=$PROGDIR/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
ARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib
ARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/include
ARMEABICRT="$ARMEABILIB/crtbegin_dynamic.o $ARMEABILIB/crtend_android.o"
LINKER=/system/bin/linker
echo "GCC:"$ARMEABIGCC "LIB:"$ARMEABILIB "LINKER":$LINKER "PARAMS:"$@
echo "CRT:"$ARMEABICRT
$ARMEABIGCC $@ -Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER -L$ARMEABILIB $ARMEABICRT -I$ARMEABIINC -nostdlib -lc
保存為b
./b hello.c -o hello
就可以了
實際就是運行命令
/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \
-Wl,-rpath-link=/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib,-dynamic-linker=/system/bin/linker \
-L/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib \
/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtbegin_dynamic.o /home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtend_android.o \
-I/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/include -nostdlib -lc \
hello.c -o hello
crtbegin_dynamic.o 和 crtend_android.o必須配對使用
第三種方法,用–sysroot也是可以的
#!/bin/sh
NDK=/home/tim/android-ndk-r8e
SYSROOT=$NDK/platforms/android-9/arch-arm
CC="$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"
CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=neon'
LDFLAGS='-Wl,--fix-cortex-a8'
$CC $@
http://www.srombauts.fr/2011/03/06/standalone-toolchain/
#include <stdio.h>
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "hello-ndk", __VA_ARGS__))
int main(void)
{
printf("Hello from NDKn");
LOGI("Hello from NDK");
return 0;
}
果然厲害,上面這段代碼都可以這樣編譯
./b9 -l log nl.c -o hn
用Makefile也能搞
CC = arm-linux-androideabi-gcc
CFLAGS = -Wall -g
LDFLAGS = -llog
SRC =hello-ndk.c
OBJ =$(SRC:.c=.o)
EXE =hello-ndk
all: $(SRC) $(EXE)
$(EXE): $(OBJ)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS)
clean:
rm -f *.o $(EXE)
編譯so庫也是可以,厲害
CC = arm-linux-androideabi-gcc
CFLAGS = -Wall -g
LDFLAGS = -llog -shared
SRC =hello-ndk.c
OBJ =$(SRC:.c=.o)
EXE =libhello-ndk.so
還可以直接運行 gcc
/home/tim/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/home/tim/android-ndk-r10/platforms/android-3/arch-arm -lc -lm -g main.c -o mm
第4種方法,用ndk-build
創建工程目錄hello,然後在其下創建子目錄jni
然後在jni下創建兩個文件,一個是hello.c,另外一個是Android.mk,內容如下
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=hello.c
LOCAL_MODULE := helloworld
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
其中LOCAL_MODULE_TAGS := optional 這行可以不要
進入到hello目錄下,運行下面的命令
# export NDK_PROJECT_PATH=`pwd`
# ndk-build
Compile thumb : helloworld <= hello.c Executable : helloworld Install : helloworld => libs/armeabi/helloworld