什麼時候用編譯器
A. 在DSP的TMS320F2812編程中c編譯器の作用是什麼。在連鏈接器中使用的cmd文件的作用是什
DSP晶元以其極高的精度,性能及運算速度等無與倫比的優點使它得到了十分廣泛的應用,TMS320F2812是TI公司生產的到目前為止用於數字控制領域的最好的DSP晶元,在對它的模擬開發過程中,編譯器生成的代碼和數據要由鏈接器分配到合適的存儲空間,通常鏈接器的命令文件.cmd文件是由用戶自己編寫的,編寫不當,就會使模擬開發不能進行,TI公司雖然在《TMS320C28x Optimizing C/C++ Compiler User』s Guide 6》和《TMS320C28x Assembly Language Tools User』s Guide 6》做了介紹,但內容卻比較散亂而且要求讀者對整個開發系統要有較全面的認識,這對於初學者來說是比較困難的。下面以TMS320F2812晶元為例,結合具體的模擬調試實例加以說明使大家能夠既快速又准確的掌握.cmd文件的分配方法。
1存儲空間的配置
TMS320F2812的DSP存儲器分為三個獨立選擇的空間-程序空間、數據空間和I/O空間,其中程序存儲器存放待執行的指令和執行中所用的系數(常數),可使用片內或片外的RAM、ROM或EPROM等來構成;數據存儲器存放指令執行中產生的數據,可使用片內或片外
的RAM和ROM來構成;I/O存儲器存放與映象外圍介面相關的數據,也可以作為附加的數據存儲空間使用。表1是TMS320F2812的存儲空間分布。
2CMD文件的分配方法
TI公司新的匯編器和鏈接器創建的目標文件採用一種COFF(通用目標文件格式),該目標文件格式更利於模塊化編程,為管理代碼段和目標系統存儲器提供了強有力和靈活的編程方法。用戶可以通過編寫鏈接命令文件(.cmd文件)將鏈接信息放在一個文件中,以便在多次使用同樣的鏈接信息時調用。在命令文件中使用兩個十分有用的偽指令MEMORY和SECTIONS,來指定實際應用中的存儲器結構和進行地址的映射。Memory用來指定目標存儲器結構,Memory下可以通過PAGE選項配置地址空間,鏈接器把每一頁都當作一個獨立的存儲空間。通常情況下,PAGE0代表程序存儲器用來存放程序,PAGE1代表數據存儲器,用來存放數據。由編譯器生成的可重定位的代碼和數據塊叫做「SECTIONS」(段),SECTIONS用來控制段的構成與地址分配。對於不同的系統配置,「SECTION」的分配方式也不相同,鏈接器通過「SECTIONS」來控制地址的分配,所以「SECTIONS」的分配就成了配置.cmd文件的重要環節。以下是對「SECTIONS」的定義及分配的詳細介紹。
(1)
被初始化的「SECTIONS」(包括數據表和可執行代碼)
.text它包括所有的可執行代碼和常數,必須放在程序頁;
.cinit它包括初始化的變數和常量表,要求放在程序頁;
.pinit它包括全局構造器(C++)初始化的變數和常量表,要求放在程序頁;
.const它包括字元串、聲明、以及被明確初始化過的全局和靜態變數,要求放在低地址的數據頁;
.econst它是在使用大存儲器模式時使用的,包括字元串、聲明、以及被明確初始化過的全局變數和靜態變數,可以放在數據頁的任何地方。
.switch它包括為轉換聲明設置的表格,可以放在程序頁也可以放在低地址的數據頁。
(2)未被初始化的「SECTIONS」(為程序運行中創建和存放的變數在存儲器中保留空間)
.bss它為全局變數和靜態變數保留空間。在程序開始運行時,C導入路徑把數據從.cinit節復制出去然後存在.bss節中,要求放在低地址的數據頁;
.ebss它是在遠(far)訪問(只用於C)和大存儲模式下使用,它為全局變數和靜態變數保留空間。在程序開始運行時,C導入路徑把數據從.cinit段復制出去然後存在.ebss節中,可以放在數據頁的任何地方;
.stack為C系統堆棧保留空間,這部分存儲器為用來將聲明傳給函數及為局部變數留出空間,要求放在低地址的數據頁;
.system動態存儲器分配保留空間。這個空間用於malloc函數,如果不使用malloc函數,這個段的大小就是0,要求放在低地址的數據頁;
.esystem動態存儲器分配保留空間,這個空間用於外部malloc函數,如果不使用外部malloc函數,這個段的大小就是0,可以放在數據頁的任何地方。
3舉例說明.cmd文件的分配方法
以下是模擬調試串列通信介面SCI時的.cmd文件的分配,已經在TMS320F2812模擬調試中得到了很好的應用。
MEMORY
{PAGE0:
/*ProgramMemory*/
RAMH0:origin=0x3F8000,length=0x001000
RAML0:origin=0x008000,length=0x001000
RAML1:origin=0x009000,length=0x001000
ROM:
origin=0x3FF000,length=0x000FC0
RESET: origin="0x3FFFC0",length=0x000002M
VECTORS:origin=0x3FFFC2,length=0x00003EM
PAGE1:/*DataMemory*/
RAMM0:origin=0x000000,length=0x000400
RAMM1:origin=0x000400,length=0x000400
RAMH0:origin=0x3F9000,length=0x001000
,,,
}
SECTIONS
{/*Allocateprogramareas:*/
.cinit
:>RAMH0
PAGE=0
.pinit
:>RAMH0
PAGE=0
.text
:>RAMH0
PAGE=0
.reset
:>RESET,PAGE=0,TYPE=DSECT
Vectors :>VECTORS,PAGE=0,TYPE=DSEC
/*:*/
.stack
:>RAMM0
PAGE=1
.ebss
:>RAMH0
PAGE=1
.esysmem :>RAMH0
PAGE=1
.econst :>RAMM1
PAGE=1
.switch :>RAMM1
PAGE=1
,,,
}
為充分利用18k×16位的SARAM,本例將高地址的8k×16位的H0 SARAM區分成兩部分,一部分用做存放程序放在PAGE0里,一部分用做存放數據放在PAGE1中以達到合理的分配;對實際模擬調試過程中的外圍幀frame0,frame1,frame2等的分配因為篇幅問題就不做具體介紹了。
4查看段的分配及使用情況
在cmd文件中包括各種各樣的鏈接器選項,每種選項代表不同的含義。其中,使用-m選項可以創建一個擴展名為.map的鏈接器(存儲器)分配映射文件,其語法為:-m filename(文件名)。鏈接器的map文件描述以下內容:
存儲器結構輸入和輸出段的定位在重新定位後外部符號的地址
通過map文件可以查看各段的分配情況,包括段的起始地址,使用的位元組數等配合cmd文件的使用,可確定各個段的使用情況,從而保證程序的正常運行和最小的空間使用。
5 VisualLinker可視化鏈接器
TI公司出品的DSP軟體開發環境CCS還提供了一種可視化生成存儲器配置文件的工具:VisualLinker可視化鏈接器。如果程序原來包含了一個鏈接器命令文件(.cmd文件),則當創
建可視化鏈接文件的時候,原來cmd文件中的內存配置仍然會被使用。如果讀者想修改內存配置,雙擊.rcp文件就會在CCS中打開可視化鏈接器的圖形界面,調整每個內存模塊的大小,直到認為合適,然後只需要重新連編,程序即可生成新的輸出文件,重復上面的步驟,直到出現滿意的結果。
B. 鏂硅垷緙栬瘧鍣ㄦ湁浠涔堜綔鐢
鏂硅垷緙栬瘧鍣ㄧ殑浣滅敤錛
銆銆1銆佹彁鍗囪繍琛屾晥鐜
銆銆
銆銆澶ч儴鍒嗗畨鍗撳簲鐢ㄩ兘娑夊強涓嶅悓寮鍙戣璦錛屼笉鍚岃璦褰㈡垚鐨勪唬鐮侀渶瑕佸湪榪愯屾佷腑榪涜屽崗鍚屼粠鑰屼駭鐢熼濆栨秷鑰椼傝屾柟鑸熺紪璇戝櫒鏄涓氱晫棣栦釜澶氳璦鑱斿悎浼樺寲鐨勭紪璇戝櫒錛屽紑鍙戣呭湪寮鍙戠幆澧冧腑鍙浠ヤ竴嬈℃у皢澶氳璦緇熶竴緙栬瘧涓轟竴濂楁満鍣ㄧ爜錛岃繍琛屾椂鏃犻渶浜х敓璺ㄨ璦甯︽潵鐨勯濆栨秷鑰楋紝騫跺彲浠ヨ繘琛岃法璇璦鐨勮仈鍚堜紭鍖栵紝鎻愬崌榪愯屾晥鐜囥
銆銆2銆佹彁鍗囩郴緇熷搷搴旀ц兘錛屾彁鍗囩郴緇熸搷浣滄祦鐣呭害
銆銆
銆銆瀹夊崜鑷韜鐨勭紪璇戞妧鏈鍦ㄤ笉鏂鐨勫彂灞曪紝浣嗗嬬粓闇瑕佸湪榪愯屼腑渚濊禆鉶氭嫙鏈烘潵榪涜屽姩鎬佺紪璇戝拰瑙i噴鎵ц岋紝瀵圭郴緇熻祫婧愭秷鑰楄緝澶с傝屾柟鑸熺紪璇戝櫒鍦ㄥ紑鍙戠幆澧冧腑灝卞彲浠ュ畬鎴愬叏閮ㄤ唬鐮佺殑緙栬瘧錛屾墜鏈哄畨瑁呭簲鐢ㄧ▼搴忓悗鏃犻渶渚濊禆鉶氭嫙鏈鴻祫婧愶紝鍗沖彲鍏ㄩ熻繍琛岀▼搴忥紝甯︽潵鏁堢巼涓婄殑鏋佸ぇ鎻愬崌銆備婦涓涓渚嬪瓙錛欵MUI 9.1浠呬粎瀵圭郴緇熺粍浠禨ystem Server搴旂敤浜嗗崕涓烘柟鑸熺紪璇戝櫒鍚庯紝灝卞甫鏉ヤ簡緋葷粺鎿嶄綔嫻佺晠搴︽彁鍗24%錛岀郴緇熷搷搴旀ц兘鎻愬崌44%鐨勬敹鐩娿
銆銆3銆佽╁洖鏀舵満鍒跺彉寰楅珮鏁
銆銆鍐呭瓨綆$悊鏄紼嬪簭寮鍙戜笌榪愯屾椂闇瑕侀噸鐐硅冭檻鐨勯儴鍒嗭紝涔熷拰緋葷粺嫻佺晠搴︽伅鎮鐩稿叧銆傚畨鍗撳湪鍐呭瓨鍥炴敹涓婇噰鐢ㄩ泦涓鍥炴敹鏈哄埗錛屽彂澹板叏灞鍥炴敹鏃舵洿闇瑕佹殏鍋滃簲鐢錛岃繖涔熸槸闅忔満鍗¢】鐨勬牴鍥犱箣涓銆傝屾柟鑸熺紪璇戝櫒鎻愪緵浜嗘洿楂樻晥鐨勫唴瀛樺洖鏀舵満鍒訛紝鍥炴敹鏃舵棤闇鏆傚仠搴旂敤錛岄殢鏃剁敤闅忔椂鍥炴敹錛屽ぇ澶ф彁楂樿繍琛岄熷害銆
銆銆4銆佷紭鍖栧簲鐢ㄧ駭緙栬瘧浼
銆銆浠g爜浼樺寲鏄緙栬瘧鍣ㄦ渶涓烘牳蹇冪殑鍔熻兘錛屼篃鏄璇勫垽涓涓緙栬瘧鍣ㄤ紭鍔f渶閲嶈佺殑鏍囧噯銆傜敱浜庡畨鍗撳簲鐢ㄤ嬌鐢ㄤ簡鉶氭嫙鏈烘満鍒訛紝闅句互闈㈠悜涓嶅悓搴旂敤瀵硅櫄鎷熸満榪涜岄拡瀵規х殑鐏墊椿浼樺寲銆傚畨鍗揂RT鐨凙oT鍜孞IT鍔ㄦ佺紪璇戝洜涓烘槸榪愯屽湪鎵嬫満涓婏紝鍙楄祫婧愭墍闄愶紝鍥犺屽彧鑳戒嬌鐢ㄧ畝鍗曠殑浼樺寲綆楁硶銆傝屾柟鑸熺紪璇戝櫒鐢變簬鏄鍦ㄥ簲鐢ㄥ紑鍙戦樁孌佃繘琛岀紪璇戱紝鎵浠ュ彲浠ュ厑璁鎬笉鍚屽簲鐢ㄧ伒媧婚噰鐢ㄤ笉鍚岀殑緙栬瘧浼樺寲鏂規堬紝鑰屼笖鍥犱負鍦ㄥ紑鍙戠幆澧冪紪璇戜笉浼氬彈鍒版墜鏈烘ц兘鐨勯檺鍒訛紝鍙浠ヤ嬌鐢ㄦ洿澶氬厛榪涚殑浼樺寲綆楁硶錛屼粠鑰屼嬌寰楁瘡涓搴旂敤鐨勬ц兘杈懼埌鏈浣熾
銆銆5銆佺畝鍗曟槗鐢錛屽紑鏀懼紑婧
銆銆鍗庝負鍦ㄦ寔緇榪涜屾妧鏈鍒涙柊鐨勫悓鏃訛紝涔熸敞閲嶅皢鎶鏈鎴愭灉鍥為堣屼笟錛屽崕涓烘柟鑸熺紪璇戝櫒鍦ㄥ紑鍙戞瀯寤虹殑闃舵典負寮鍙戣呮彁渚涘揩閫熺殑闆嗘垚緙栬瘧鐜澧冿紝澶уぇ闄嶄綆浜嗗紑鍙戣呯殑瀛︿範鎴愭湰鍜屼嬌鐢ㄦ垚鏈錛屼護浜т笟涓庢洿澶氱敤鎴峰彈鐩娿傚崕涓烘柟鑸熺紪璇戝櫒浼氫粠2019騫村紑濮嬪叏闈㈠紑婧愶紝閭璇鋒暣涓浜т笟鍜岀敓鎬佹潵涓璧峰叡鍚屽叧娉ㄥ拰鎻愬崌瀹夊崜鎬ц兘浣撻獙銆傜戶鍗庝負P30緋誨垪鍙戝竷浼氭柟鑸熺紪璇戝櫒寮婧愬悗錛屽皢鍦2019騫8鏈堢殑鍗庝負緇堢寮鍙戣呭ぇ浼氬e竷鏂硅垷緙栬瘧妗嗘灦浠g爜寮婧愶紝鍚庣畫浼氬湪2019騫11鏈堢殑緇跨洘寮鍙戣呭ぇ浼氬疄鐜板畬鏁存柟鑸熺紪璇戝櫒浠g爜寮婧愩
C. 緙栬瘧鍣 鏄浠涔堬紵鐢ㄦ硶鍜岀敤閫旓紵
綆鍗曡詫紝緙栬瘧鍣ㄥ氨鏄灝嗏滈珮綰ц璦鈥濈炕璇戜負鈥滄満鍣ㄨ璦錛堜綆綰ц璦錛夆濈殑紼嬪簭銆
D. c語言的編譯器是干什麼用的
編譯器的作用:將C源程序文件編譯生成對應機器的機器碼obj文件,再將obj文件連接生成可執行的EXE文件。
推薦你使用Dev-CPP
E. C語言的編譯器和普通應用程序有什麼區別嗎
當然有區別啊,運行方式也不一樣。
考慮到你可能不是從事開發工作的人,我就不用專業術語解釋了,解釋如下:
編譯器:將使用開發語言,人工書寫的邏輯、函數等,俗稱「代碼」,翻譯成機器能理解的語言,機器只能理解二進制語言,即:0和1。比如:125這個數字在計算機中存儲就是「01111101」。具體換算方法要參照計算機書籍中了。
普通應用程序:是使用開發語言,人工書寫的邏輯、函數等,俗稱「代碼」,通過編譯器翻譯成機器能理解的語言之後,再進行封裝打包成:例如exe文件之類的可執行文件,讓計算機通過自己的方式顯示出來並與用戶進行交互。
它們之間最大的區別的,就是:
編譯器可以直接與「用戶開發的代碼」和「計算機」進行數據交互的;
普通應用程序相當於是通過編譯器和計算機進行數據交互。
F. 新手寫代碼用什麼軟體好
新手寫代碼,那得看是哪個語言的新手。
本人簡單學過四種語言,c語言、c++、java和python,下面我就針對這四種種進行推薦:
c語言和c++
我曾用過兩種編譯器,到最後發現
dev-c++編譯器
用著比較舒服,後來學習一直用它。
java
如果是這門語言,你的電腦配置較好(8G內存,i5以上)可以試試
idea編譯器
如果你的電腦配置不好,推薦使用
eclipse編譯器
當然,本人學習java進階網站製作類。
如果你是一個廳燃沒前端新人,我推薦你使用
subline編譯器
如果你是一個後端新人扮納,我段襲推薦你使用
notepad編譯器或者editplus編譯器
python
這門語言學的比較淺,本人用自帶的用的還好。
G. 用C語言編程時需不需要編譯器
需要。要不.c文件不可能運行。許多C開發工具都帶了編譯器了,如TuboC什麼的,不是有編譯的按鈕嗎
H. 編譯器有什麼用
簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器(Linker) → 可執行程序 (executables)
高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
對於C#、VB等高級語言而言,此時編譯器完成的功能是把源碼(SourceCode)編譯成通用中間語言(MSIL/CIL)的位元組碼(ByteCode)。最後運行的時候通過通用語言運行庫的轉換,編程最終可以被CPU直接計算的機器碼(NativeCode)。
I. linux中gcc編譯器如何使用
2004年4月20日最新版本的GCC編譯器3.4.0發布了。目前,GCC可以用來編譯C/C++、FORTRAN、JAVA、OBJC、ADA等語言的程序,可根據需要選擇安裝支持的語言。GCC 3.4.0比以前版本更好地支持了C++標准。本文以在Redhat Linux上安裝GCC3.4.0為例,介紹了GCC的安裝過程。
安裝之前,系統中必須要有cc或者gcc等編譯器,並且是可用的,或者用環境變數CC指定系統上的編譯器。如果系統上沒有編譯器,不能安裝源代碼形式的GCC 3.4.0。如果是這種情況,可以在網上找一個與你系統相適應的如RPM等二進制形式的GCC軟體包來安裝使用。本文介紹的是以源代碼形式提供的GCC軟體包的安裝過程,軟體包本身和其安裝過程同樣適用於其它Linux和Unix系統。
系統上原來的GCC編譯器可能是把gcc等命令文件、庫文件、頭文件等分別存放到系統中的不同目錄下的。與此不同,現在GCC建議我們將一個版本的GCC安裝在一個單獨的目錄下。這樣做的好處是將來不需要它的時候可以方便地刪除整個目錄即可(因為GCC沒有uninstall功能);缺點是在安裝完成後要做一些設置工作才能使編譯器工作正常。在本文中我採用這個方案安裝GCC 3.4.0,並且在安裝完成後,仍然能夠使用原來低版本的GCC編譯器,即一個系統上可以同時存在並使用多個版本的GCC編譯器。
按照本文提供的步驟和設置選項,即使以前沒有安裝過GCC,也可以在系統上安裝上一個可工作的新版本的GCC編譯器。
1. 下載
在GCC網站上()或者通過網上搜索可以查找到下載資源。目前GCC的最新版本為 3.4.0。可供下載的文件一般有兩種形式:gcc-3.4.0.tar.gz和gcc-3.4.0.tar.bz2,只是壓縮格式不一樣,內容完全一致,下載其中一種即可。
2. 解壓縮
根據壓縮格式,選擇下面相應的一種方式解包(以下的「%」表示命令行提示符):
% tar xzvf gcc-3.4.0.tar.gz
或者
% bzcat gcc-3.4.0.tar.bz2 | tar xvf -
新生成的gcc-3.4.0這個目錄被稱為源目錄,用${srcdir}表示它。以後在出現${srcdir}的地方,應該用真實的路徑來替換它。用pwd命令可以查看當前路徑。
在${srcdir}/INSTALL目錄下有詳細的GCC安裝說明,可用瀏覽器打開index.html閱讀。
3. 建立目標目錄
目標目錄(用${objdir}表示)是用來存放編譯結果的地方。GCC建議編譯後的文件不要放在源目錄${srcdir]中(雖然這樣做也可以),最好單獨存放在另外一個目錄中,而且不能是${srcdir}的子目錄。
例如,可以這樣建立一個叫 gcc-build 的目標目錄(與源目錄${srcdir}是同級目錄):
% mkdir gcc-build
% cd gcc-build
以下的操作主要是在目標目錄 ${objdir} 下進行。
4. 配置
配置的目的是決定將GCC編譯器安裝到什麼地方(${destdir}),支持什麼語言以及指定其它一些選項等。其中,${destdir}不能與${objdir}或${srcdir}目錄相同。
配置是通過執行${srcdir}下的configure來完成的。其命令格式為(記得用你的真實路徑替換${destdir}):
% ${srcdir}/configure --prefix=${destdir} [其它選項]
例如,如果想將GCC 3.4.0安裝到/usr/local/gcc-3.4.0目錄下,則${destdir}就表示這個路徑。
在我的機器上,我是這樣配置的:
% ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java
將GCC安裝在/usr/local/gcc-3.4.0目錄下,支持C/C++和JAVA語言,其它選項參見GCC提供的幫助說明。
5. 編譯
% make
這是一個漫長的過程。在我的機器上(P4-1.6),這個過程用了50多分鍾。
6. 安裝
執行下面的命令將編譯好的庫文件等拷貝到${destdir}目錄中(根據你設定的路徑,可能需要管理員的許可權):
% make install
至此,GCC 3.4.0安裝過程就完成了。
6. 其它設置
GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、庫文件等都在${destdir}目錄下分別存放,如命令文件放在bin目錄下、庫文件在lib下、頭文件在include下等。由於命令文件和庫文件所在的目錄還沒有包含在相應的搜索路徑內,所以必須要作適當的設置之後編譯器才能順利地找到並使用它們。
6.1 gcc、g++、gcj的設置
要想使用GCC 3.4.0的gcc等命令,簡單的方法就是把它的路徑${destdir}/bin放在環境變數PATH中。我不用這種方式,而是用符號連接的方式實現,這樣做的好處是我仍然可以使用系統上原來的舊版本的GCC編譯器。
首先,查看原來的gcc所在的路徑:
% which gcc
在我的系統上,上述命令顯示:/usr/bin/gcc。因此,原來的gcc命令在/usr/bin目錄下。我們可以把GCC 3.4.0中的gcc、g++、gcj等命令在/usr/bin目錄下分別做一個符號連接:
% cd /usr/bin
% ln -s ${destdir}/bin/gcc gcc34
% ln -s ${destdir}/bin/g++ g++34
% ln -s ${destdir}/bin/gcj gcj34
這樣,就可以分別使用gcc34、g++34、gcj34來調用GCC 3.4.0的gcc、g++、gcj完成對C、C++、JAVA程序的編譯了。同時,仍然能夠使用舊版本的GCC編譯器中的gcc、g++等命令。
6.2 庫路徑的設置
將${destdir}/lib路徑添加到環境變數LD_LIBRARY_PATH中,最好添加到系統的配置文件中,這樣就不必要每次都設置這個環境變數了。
例如,如果GCC 3.4.0安裝在/usr/local/gcc-3.4.0目錄下,在RH Linux下可以直接在命令行上執行或者在文件/etc/profile中添加下面一句:
setenv LD_LIBRARY_PATH /usr/local/gcc-3.4.0/lib:$LD_LIBRARY_PATH
7. 測試
用新的編譯命令(gcc34、g++34等)編譯你以前的C、C++程序,檢驗新安裝的GCC編譯器是否能正常工作。
8. 根據需要,可以刪除或者保留${srcdir}和${objdir}目錄。