亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区

當(dāng)前位置:首頁(yè) > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > Build編譯工具學(xué)習(xí)筆記:常用命令參數(shù)和BRF文件

Build編譯工具學(xué)習(xí)筆記:常用命令參數(shù)和BRF文件
2010-01-13 22:51:53  作者:  來(lái)源:
build工具的主頁(yè)在:http://www.dsource.org/projects/build
它以前叫 bud,所以這里混用 bud 和build,都指的同一個(gè)東西

build是D語(yǔ)言的編譯工具,相當(dāng)于C的make命令。
但它更簡(jiǎn)單且好用,因?yàn)樗芴幚?import 語(yǔ)句,自動(dòng)載入依賴(lài)的文件。
看過(guò)本文后,基本上可以使用了。
如果你想用它的高級(jí)功能,當(dāng)然還得花時(shí)間去研究它。

build 會(huì)涉及的文件有:
  brf文件 (Build Response File) -- bud命令的參數(shù)文件
  源文件的 Pragmas 指令
  rdf文件 (Rule Definition File) -- 規(guī)則定義文件
  mdf文件 (Macro Definition File) -- 宏定義文件
  cfg文件 (Configuration File) -- 配置文件
  pfl文件 (Profile File) -- 配置文件?

其中,brf文件里面寫(xiě)的就是一些build命令的參數(shù),所以,先從參數(shù)開(kāi)始。

先看幾個(gè)簡(jiǎn)單參數(shù),然后再說(shuō)說(shuō)brf文件,最后把其他參數(shù)簡(jiǎn)單的列一下。
[注:以下在Linux和dmd下測(cè)試過(guò),沒(méi)有測(cè)試win和gdc]

build命令的格式是:

Java代碼 復(fù)制代碼
  1. build <sourcefile> [<switches> ] [<otherfiles> ]   
  2. sourcefile   一般是包括main函數(shù)的源文件   
  3. switches     上面列出的參數(shù)   
  4. otherfiles   鏈接庫(kù),object文件,宏定義文件等等其他文件(猜的:))  

參數(shù)和源文件都沒(méi)有順序,可以任意排列 -- 喜歡把源文件放前面,編譯參數(shù)放后面,因?yàn)榫幾g參數(shù)經(jīng)常改

Bud的常用參數(shù)之一:常規(guī)選項(xiàng)
Java代碼 復(fù)制代碼
  1. -exec           編譯成功后,運(yùn)行它   
  2. -cleanup        在編譯完成后,把生成的中間文件刪除掉,比如 .o 文件   
  3. -full           編譯所有的文件,即使沒(méi)有修改也要編譯一遍   
  4. -T<name>          指定目標(biāo)的文件名   
  5. -od<path>         指定.o 等臨時(shí)文件的輸出目錄   
  6.   
  7. -silent         安靜模式,不輸出多余信息   
  8. -test           只是顯示要調(diào)用的命令,不實(shí)際編譯   
  9. -v              build 和 dmd 都是調(diào)試模式   
  10. -V              build 是調(diào)試模式,但dmd命令不是   
  11. -info           顯示build命令的版本號(hào)等信息   
  12. -names          顯示要編譯的文件名   
  13. -uses[=fname]   輸出交叉引用文件              



如果不是bud的參數(shù),會(huì)傳遞給dmd。比如可以指定 -op -L-l 參數(shù) [注:猜的,不肯定]


命令參數(shù)如果是一個(gè)橫線(xiàn)(-),表示啟用,如果是兩個(gè)橫線(xiàn)(--),表明禁用。
比如: bud --cleanup -full
兩個(gè)橫線(xiàn)(--)一般和brf文件配合使用,表明要禁用brf文件中的某個(gè)編譯參數(shù)

給個(gè)例子:a.d 和 b.d
Java代碼 復(fù)制代碼
  1. module a;   
  2.   
  3. import b;   
  4. import std.stdio;   
  5.   
  6. void main(char[][] arg)   
  7. {   
  8.     writef("in Module A: ");   
  9.     writefln(arg);   
  10.     print_b();   
  11. }  

Java代碼 復(fù)制代碼
  1. module b;   
  2.   
  3. import std.stdio;   
  4.   
  5. void print_b()   
  6. {   
  7.     writefln("in Module B: b.d");   
  8. }  


最簡(jiǎn)單的編譯方法:
Java代碼 復(fù)制代碼
  1. bud a.d   
  2. bud a                   # 可以不寫(xiě) .d 后綴  

注意,這里不需要指定 b.d,因?yàn)閍.d中的import起了作用。
bud命令會(huì)自動(dòng)處理。是不是很簡(jiǎn)單?

編譯后讓它運(yùn)行:
Java代碼 復(fù)制代碼
  1. bud a.d -exec   
  2. bud a.d -execXXX        # 給個(gè)參數(shù)XXX   
  3. bud a.d -exec"XXX YYY"  # 給2個(gè)參數(shù)XXX YYY  ; 在bash下不能正確運(yùn)行,不知道怎么處理  


改個(gè)名字:
Java代碼 復(fù)制代碼
  1. bud a.d -Ta.out          # 文件名是:a.out   ;在命令行下,生成不了a.out,不知道怎么處理;(   
  2. bud a.d -Ttest_{Target}  # 文件名是:test_a  


如果你不修改a.d或者b.d,多次運(yùn)行上面的命令,會(huì)提示:
Java代碼 復(fù)制代碼
  1. Files are up to date, no build required.  

這個(gè)和make的原理一樣,如果你想每次都編譯,可以這么辦:
Java代碼 復(fù)制代碼
  1. bud a.d -full  


如果看著那么多的.o文件不爽,就把它刪掉:
Java代碼 復(fù)制代碼
  1. bud a.d -clean      # -clean 是-cleanup的別名  


幾個(gè)調(diào)試選項(xiàng):
Java代碼 復(fù)制代碼
  1. bud a.d -names      # 顯示要編譯的文件名   
  2. bud a.d -test       # 顯示dmd和gcc的調(diào)用命令   
  3. bud .ad -uses=x     # 生成交叉引用文件,默認(rèn)文件名是a.use,這里指定為x   
  4. bud a.d -v          # 除了bud的調(diào)試信息,還顯示dmd編譯器的調(diào)試信息   
  5. bud a.d -V          # 只顯示bud的調(diào)試信息  


use文件:
Java代碼 復(fù)制代碼
  1. [USES]   
  2. a.d <> /usr/local/src/phobos/std/stdio.d   
  3. a.d <> b.d    
  4. b.d <> /usr/local/src/phobos/std/stdio.d   
  5. [USEDBY]   
  6. /usr/local/src/phobos/std/stdio.d <> a.d    
  7. /usr/local/src/phobos/std/stdio.d <> b.d    
  8. b.d <> a.d  

可以看到,有2個(gè)標(biāo)簽:[USES] 和[USEDBY]
[USES]  的含義是 A 文件使用了哪些文件
[USEDBY] 的含義是 哪些 文件 別 A文件 使用了
每行的文件名之間用 <> 分割
升序排列

Bud的常用參數(shù)之二:編譯選項(xiàng)
[注:對(duì)編譯器的術(shù)語(yǔ)不是很清楚,會(huì)有些表達(dá)不清楚。回頭研究一下編譯術(shù)語(yǔ),再來(lái)修改這段】
編譯過(guò)程一般是 a.d (源文件)  -> a.o (object文件) -> a.exe (可執(zhí)行文件),這里不討論預(yù)處理等過(guò)程
object文件還可以編譯成 靜態(tài)鏈接庫(kù)(liba.a) 或者 動(dòng)態(tài)鏈接庫(kù)(liba.so)

a.d 到 a.o 的過(guò)程叫編譯 過(guò)程
a.o 到 a.exe 的過(guò)程叫 連接過(guò)程(link)
a.o 到 liba.a/so 的過(guò)程叫 lib過(guò)程      [注:實(shí)在不知道怎么翻譯;( ]

bud 默認(rèn)會(huì)把有main()或者Winmain()函數(shù)的源程序編譯成可執(zhí)行文件;
如果沒(méi)有這兩個(gè)函數(shù),則會(huì)被編譯成鏈接庫(kù)文件(.a)
下面這些選項(xiàng)可以改變這些行為:
不知道怎么生成 .so的文件?

Java代碼 復(fù)制代碼
  1. -obj          只是創(chuàng)建 object文件(.o),不進(jìn)行l(wèi)ink和lib操作,等同于同時(shí)加 -nolink -nolib   
  2. -link         即使源文件中沒(méi)有main()函數(shù),也強(qiáng)制進(jìn)行連接。   
  3.                 main()函數(shù)一般在鏈接庫(kù)中,而不在要編譯的源代碼中   
  4. -nolink       針對(duì)有main()函數(shù)的源文件:不進(jìn)行l(wèi)ink操作,只生成 .o 文件   
  5. -lib          針對(duì)有main()函數(shù)的源文件:不進(jìn)行l(wèi)ink操作,只生成 .a 文件   
  6. -nolib        針對(duì)沒(méi)有main()函數(shù)的源文件:不進(jìn)行l(wèi)ib操作,只生成 .o 文件   
  7. -allobj       不懂:(   
  8.   
  9. -LIBOPT       指定要連接的參數(shù)   
  10. -LIBPATH      指定鏈接庫(kù)的目錄   
  11. -PP           指定除當(dāng)前路徑外的 其他源文件的搜索路徑  


舉例吧:

Java代碼 復(fù)制代碼
  1. #-obj:只生成.o 文件   
  2. bud a.d -obj         # 會(huì)同時(shí)生成 a.o b.o   
  3. bud b.d -obj         # 生成 b.o,不會(huì)生成 a.o ;)   
  4.   
  5. #-link:強(qiáng)制連接   
  6. bud a.d -obj         # 生成 a.o   
  7. bud b.d a.o          # 生成 b 可執(zhí)行文件   
  8.   
  9. #-nolink:不鏈接   
  10. bud a.d -nolink      # 生成 a.o   
  11.   
  12. #-lib:生成 靜態(tài)庫(kù)   
  13. bud a.d -lib         # 生成 a.a 為何不是liba.a?   
  14.   
  15. #-nolib: 不生成 靜態(tài)庫(kù)   
  16. bud b.d -nolib       # 生成 b.o ,而不是 b.a  


LIZBOPT的作用不大清楚,把原文的定義列出來(lái)吧,偷懶了
-LIBOPT
This allows you to pass one or more command line arguments to the librarian.

Java代碼 復(fù)制代碼
  1. Example: Set the page size to 32Kb   
  2.     -LIBOPT-p32   
  3. Example: Embedded spaces enclosed in quotes.   
  4.     "-LIBOPT -l -i"  


-LIBPATH
This allows you to add one or more paths to be searched for library files.
This might be used when you don't want to permanently update the standard search paths.

Example:
Java代碼 復(fù)制代碼
  1. -LIBPATH=c:\mylibs;d:\3rdparty;c:\lib\debuglibs   
  2. BPATH=/usr/lib:/usr/local/lib:/usr/local/lib/mysql/    


-PP 舉例:
把b.d 文件移動(dòng) / 目錄下,用bud a.d 編譯就會(huì)提示找不到b.d,ok
Java代碼 復(fù)制代碼
  1. bud a.d -PP/         # 提示找不到 /b.o,因?yàn)榫幾g的b.o生成在了當(dāng)前目錄,而不是根目錄   
  2. bud a.d -PP/ -op     # 方案1:op是dmd的編譯參數(shù),表示在源文件的路徑下生成.o文件   
  3. bud a.d -PP/ -odobj  # 方案2:把.o文件都輸出到 obj 目錄下  


dmd命令的-L參數(shù):指定
Java代碼 復(fù)制代碼
  1. -L                  指定一個(gè)連接參數(shù),比如:   
  2.                         -L-lpthread  linux下鏈接libpthread.so  


brf文件使用說(shuō)明

brf文件就是定義了各種bud命令參數(shù)的集合。
文件擴(kuò)展名是:.brf

舉例:
文件名:final.brf
Java代碼 復(fù)制代碼
  1. # 生成發(fā)行版本        # #符號(hào)是brf文件的注釋符號(hào)   
  2. -T{Target}_release  # 應(yīng)用程序的名字   
  3. -release            # Don't generate runtime checks.   
  4. -full               # 重新編譯所有文件   
  5. -cleanup            # 編譯完成后清除中間文件   
  6. -inline             # 進(jìn)行內(nèi)聯(lián)優(yōu)化  


運(yùn)行方法:
Java代碼 復(fù)制代碼
  1. bud a @final        # 注意@符號(hào)   
  2. bud a @final --inline      
  3.                     # 把inline選項(xiàng)禁用;有警告,不知道原因;(  


可以把源文件寫(xiě)到 brf 文件中
每行一個(gè)編譯參數(shù),沒(méi)有順序
可以用 -- 選項(xiàng),把brf文件中的參數(shù)禁用了
不可以像Makefile文件一樣,定義多個(gè)編譯目標(biāo)。定義多個(gè)brf文件吧

bud命令的默認(rèn)brf文件叫 build.brf,如果要使用默認(rèn)的brf,則可以不用指定文件名:
Java代碼 復(fù)制代碼
  1. bud @  


多放幾個(gè)例子上來(lái),備忘:
來(lái)自:http://dlang.group.javaeye.com/group/topic/1072?page=6
Java代碼 復(fù)制代碼
  1. -cleanup            編譯后清理掉.o文件     
  2. -L-lpthread         linux下鏈接libpthread.so     
  3. -LIBPATH=c:\db      設(shè)置庫(kù)鏈接路徑     
  4. libdb45.lib         直接鏈接windows下使用的lib文件     
  5. -op                 .o文件輸出到源文件所在路徑     
  6. -odobjs             把.o文件輸出到objs文件夾     
  7. -T../bin/test 編譯的可執(zhí)行文件輸出路徑    

# 一個(gè)簡(jiǎn)單的make.brf 文件
Java代碼 復(fù)制代碼
  1. -cleanup     
  2. -op     
  3. -L-ldb     
  4. -LIBPATH=/home/lijie/dm/lib:/home/lijie/dmd/lib:/usr/local/BerkeleyDB.4.5/lib     
  5. src/test.d     
  6. -T../bin/test    


其他bud參數(shù)

如果沒(méi)有給出定義,就自己看文檔吧,我也不大理解 ;)
Java代碼 復(fù)制代碼
  1. -DCPATH             指定編譯器的安裝路徑   
  2. -CFPATH             指定D配置文件的路徑   
  3. -BCFPATH            指定Bud配置文件的路徑   
  4.   
  5. -RDF<file>            指定RDF文件(Rule Definition File)的路徑   
  6. -MDF<file>            指定MDF文件(Macro Definition File)的路徑   
  7.   
  8. -nodef              不創(chuàng)建 MDF(Module Definition File)文件   
  9. -explicit           只編譯指定的文件   
  10. -usefinal              
  11.   
  12. -dll                如果源文件有DllMain()函數(shù),默認(rèn)會(huì)編譯成Dll庫(kù);...   
  13. -gui                如果源文件有WinMain()函數(shù),默認(rèn)會(huì)編譯成GUI程序;...   
  14.   
  15. -help               顯示幫助   
  16.   
  17. -AutoWinLibs(=<Yes/No>)   
  18. -modules(=<name>)   
  19. -UMB=<Yes/No>   
  20. -R<option>   
  21. -emptyargs             
  22.   
  23. -M<name>   
  24. -X<name>  


Bud的編譯安裝
下載源程序
make -f Makefile.unix
./build build -full -op
ln -s build bud

后記:
因?yàn)槲抑皇怯肈寫(xiě)寫(xiě)測(cè)試程序, 基本上就2、3個(gè)文件,最多有個(gè)C的鏈接庫(kù)。
我的這點(diǎn)小需求,bud命令還是能很好處理的。更復(fù)雜的情況,我就不了解。

文中有些錯(cuò)誤,和不肯定的地方,等我弄明白了再來(lái)修正吧。

安徽新華電腦學(xué)校專(zhuān)業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線(xiàn)咨詢(xún)
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
97国产精品人人爽人人做| 久久久久久久久久久久久国产| 日韩av影视| 国产av第一区| 精品国产一区二区三区免费| 国产精品二区三区四区| 久热精品在线视频| 在线码字幕一区| 夜夜爽www精品| 亚洲欧美在线网| 日韩av电影中文字幕| 日本www在线播放| 欧美在线视频网| 精品亚洲第一| 成人国产亚洲精品a区天堂华泰| 成人黄色av网站| 国产激情在线观看视频| 久久亚洲午夜电影| 国产xxx69麻豆国语对白| 神马国产精品影院av| 国产精品无码专区av在线播放| 国产精品免费小视频| 色综合五月天导航| 亚洲精品无人区| 日韩欧美视频第二区| 国语自产精品视频在免费| 精品一区二区三区视频日产| 高清在线观看免费| 久久精品国产美女| 久久综合伊人77777| 一道精品一区二区三区| 日韩国产欧美亚洲| 国产日韩一区在线| 国产精品69精品一区二区三区| 久久久久久久激情视频| 久久国产天堂福利天堂| 日韩在线三区| 国产色一区二区三区| 久久免费视频网站| 久久中文久久字幕| 日本在线视频不卡| 国产日韩中文在线| 日韩中文字幕视频在线观看| 欧美激情第6页| 日韩经典在线视频| 成人免费在线小视频| y97精品国产97久久久久久| 一区二区三区四区免费视频 | 国产精品国产三级国产aⅴ浪潮| 亚洲综合精品伊人久久| 欧美在线视频网站| 91精品国产沙发| 久久夜色精品国产| 日本成人黄色免费看| 成人动漫在线观看视频| 国产精品无码av无码| 日韩av免费网站| 浮妇高潮喷白浆视频| 国产精品美乳一区二区免费| 日本国产一区二区三区| 成人精品在线视频| 国产精品欧美久久| 日韩欧美一级在线| 91九色在线观看视频| 精品久久久久久亚洲| 欧美视频1区| 久久精品视频16| 亚洲黄色一区二区三区| 国产又粗又猛又爽又黄的网站| 久久久久中文字幕| 无码日韩人妻精品久久蜜桃| 国产精品一区二区三区在线播放| 国产精品欧美激情| 日韩久久久久久久久久久久 | 欧美一区1区三区3区公司| 成人美女免费网站视频| 毛片精品免费在线观看| 麻豆久久久av免费| 久久色精品视频| 欧美中文字幕在线观看视频| 国产福利久久| 日本一区二区三区四区在线观看| 91av福利视频| 懂色av粉嫩av蜜臀av| 97伦理在线四区| 午夜精品久久久久久久99热浪潮| 99久久国产综合精品五月天喷水| 欧美成人午夜剧场免费观看| 韩国国内大量揄拍精品视频| 国产精品久久久久一区二区| 极品尤物一区二区三区| 国产精品极品在线| 国产一区二区高清不卡| 国产精品欧美日韩| 国产亚洲欧美在线视频| 欧美激情第三页| av一区二区三区免费观看| 亚洲中文字幕无码专区| 91久久久久久| 日本国产一区二区三区| 久久精品国产一区| 国产综合在线看| 中文视频一区视频二区视频三区| 国产九九精品视频| 亚洲色成人www永久在线观看| www亚洲国产| 欧美一区二区三区图| 九一国产精品视频| 欧美日韩一区二区三区免费| 国产精品电影网站| 99在线视频首页| 日韩欧美视频一区二区| 国产精品久久久久久久久久ktv | 国产精品成人av在线| 国产精品一区二区不卡视频| 亚洲中文字幕无码不卡电影| 91精品国产高清久久久久久91裸体| 色欲av无码一区二区人妻| 国产成人三级视频| 国产免费一区二区三区在线观看| 亚洲在线www| 久久精品国亚洲| 国产精品午夜一区二区欲梦| 视频一区二区三区免费观看| 国产成人精品优优av| 国产欧美一区二区三区在线| 午夜一区二区三视频在线观看| 日日噜噜噜夜夜爽亚洲精品| 国产日韩精品一区观看| 亚洲精品电影在线一区| 久久久精品美女| 成人久久久久久久久| 欧美影视一区二区| 伊人久久大香线蕉午夜av| 国产不卡在线观看| 国产欧美日韩精品专区| 日本久久久网站| 国产aⅴ精品一区二区三区黄| 国产黄视频在线| 国产免费毛卡片| 欧美中文字幕第一页| 亚洲精品欧美精品| 久久亚洲精品国产亚洲老地址| 久久久亚洲网站| 国产日韩欧美中文在线播放| 日韩欧美精品在线观看视频| 亚洲最大福利视频网站| 国产精品偷伦免费视频观看的| 99视频在线免费观看| 免费国产a级片| 日韩欧美一区三区| 亚洲一区二区三区免费看| 国产精品国产亚洲精品看不卡| 久久国产一区二区| 成人亚洲综合色就1024| 韩国视频理论视频久久| 日韩少妇中文字幕| 久久久久久草| 97国产在线视频| 国产另类第一区| 欧美日韩精品久久久免费观看| 色综合久久88色综合天天提莫| 久久久久久91| 欧美猛交ⅹxxx乱大交视频| 国产成人无码精品久久久性色| 久久男人资源视频| 91精品国产91久久久久久最新| 福利视频久久| 高清视频一区二区三区| 国产啪精品视频网站| 国产一区在线免费| 精品一区在线播放| 国内视频一区| 欧美日韩一道本| 欧美亚洲视频一区二区| 欧美一区二区三区在线播放| 亚洲蜜桃在线| 亚欧洲精品在线视频免费观看| 亚洲综合在线中文字幕| 欧美激情精品久久久久| 久久99热精品| 欧美日本黄视频| 欧美日韩国产成人在线观看| 色综合久久悠悠| 欧美极品在线播放| 在线一区日本视频| 中文字幕日本最新乱码视频| 欧美精品电影在线| 亚洲专区在线视频| 午夜免费在线观看精品视频| 中文字幕一区二区三区有限公司| 欧美激情第6页| 亚洲精品在线免费看| 亚洲精品无人区| 日本一区二区视频| 日韩免费毛片| 国内一区二区三区在线视频 | 精品人妻人人做人人爽| 国产在线视频不卡| 国产精品揄拍500视频|