它以前叫 bud,所以這里混用 bud 和build,都指的同一個(gè)東西
build是D語言的編譯工具,相當(dāng)于C的make命令。
但它更簡單且好用,因?yàn)樗芴幚?import 語句,自動(dòng)載入依賴的文件。
看過本文后,基本上可以使用了。
如果你想用它的高級(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文件里面寫的就是一些build命令的參數(shù),所以,先從參數(shù)開始。
先看幾個(gè)簡單參數(shù),然后再說說brf文件,最后把其他參數(shù)簡單的列一下。
[注:以下在Linux和dmd下測試過,沒有測試win和gdc]
build命令的格式是:
- build <sourcefile> [<switches> ] [<otherfiles> ]
- sourcefile 一般是包括main函數(shù)的源文件
- switches 上面列出的參數(shù)
- otherfiles 鏈接庫,object文件,宏定義文件等等其他文件(猜的:))
參數(shù)和源文件都沒有順序,可以任意排列 -- 喜歡把源文件放前面,編譯參數(shù)放后面,因?yàn)榫幾g參數(shù)經(jīng)常改
Bud的常用參數(shù)之一:常規(guī)選項(xiàng)
- -exec 編譯成功后,運(yùn)行它
- -cleanup 在編譯完成后,把生成的中間文件刪除掉,比如 .o 文件
- -full 編譯所有的文件,即使沒有修改也要編譯一遍
- -T<name> 指定目標(biāo)的文件名
- -od<path> 指定.o 等臨時(shí)文件的輸出目錄
- -silent 安靜模式,不輸出多余信息
- -test 只是顯示要調(diào)用的命令,不實(shí)際編譯
- -v build 和 dmd 都是調(diào)試模式
- -V build 是調(diào)試模式,但dmd命令不是
- -info 顯示build命令的版本號(hào)等信息
- -names 顯示要編譯的文件名
- -uses[=fname] 輸出交叉引用文件
如果不是bud的參數(shù),會(huì)傳遞給dmd。比如可以指定 -op -L-l 參數(shù) [注:猜的,不肯定]
命令參數(shù)如果是一個(gè)橫線(-),表示啟用,如果是兩個(gè)橫線(--),表明禁用。
比如: bud --cleanup -full
兩個(gè)橫線(--)一般和brf文件配合使用,表明要禁用brf文件中的某個(gè)編譯參數(shù)
給個(gè)例子:a.d 和 b.d
- module a;
- import b;
- import std.stdio;
- void main(char[][] arg)
- {
- writef("in Module A: ");
- writefln(arg);
- print_b();
- }
- module b;
- import std.stdio;
- void print_b()
- {
- writefln("in Module B: b.d");
- }
最簡單的編譯方法:
- bud a.d
- bud a # 可以不寫 .d 后綴
注意,這里不需要指定 b.d,因?yàn)閍.d中的import起了作用。
bud命令會(huì)自動(dòng)處理。是不是很簡單?
編譯后讓它運(yùn)行:
- bud a.d -exec
- bud a.d -execXXX # 給個(gè)參數(shù)XXX
- bud a.d -exec"XXX YYY" # 給2個(gè)參數(shù)XXX YYY ; 在bash下不能正確運(yùn)行,不知道怎么處理
改個(gè)名字:
- bud a.d -Ta.out # 文件名是:a.out ;在命令行下,生成不了a.out,不知道怎么處理;(
- bud a.d -Ttest_{Target} # 文件名是:test_a
如果你不修改a.d或者b.d,多次運(yùn)行上面的命令,會(huì)提示:
- Files are up to date, no build required.
這個(gè)和make的原理一樣,如果你想每次都編譯,可以這么辦:
- bud a.d -full
如果看著那么多的.o文件不爽,就把它刪掉:
- bud a.d -clean # -clean 是-cleanup的別名
幾個(gè)調(diào)試選項(xiàng):
- bud a.d -names # 顯示要編譯的文件名
- bud a.d -test # 顯示dmd和gcc的調(diào)用命令
- bud .ad -uses=x # 生成交叉引用文件,默認(rèn)文件名是a.use,這里指定為x
- bud a.d -v # 除了bud的調(diào)試信息,還顯示dmd編譯器的調(diào)試信息
- bud a.d -V # 只顯示bud的調(diào)試信息
use文件:
- [USES]
- a.d <> /usr/local/src/phobos/std/stdio.d
- a.d <> b.d
- b.d <> /usr/local/src/phobos/std/stdio.d
- [USEDBY]
- /usr/local/src/phobos/std/stdio.d <> a.d
- /usr/local/src/phobos/std/stdio.d <> b.d
- b.d <> a.d
可以看到,有2個(gè)標(biāo)簽:[USES] 和[USEDBY]
[USES] 的含義是 A 文件使用了哪些文件
[USEDBY] 的含義是 哪些 文件 別 A文件 使用了
每行的文件名之間用 <> 分割
升序排列
Bud的常用參數(shù)之二:編譯選項(xiàng)
[注:對(duì)編譯器的術(shù)語不是很清楚,會(huì)有些表達(dá)不清楚。回頭研究一下編譯術(shù)語,再來修改這段】
編譯過程一般是 a.d (源文件) -> a.o (object文件) -> a.exe (可執(zhí)行文件),這里不討論預(yù)處理等過程
object文件還可以編譯成 靜態(tài)鏈接庫(liba.a) 或者 動(dòng)態(tài)鏈接庫(liba.so)
a.d 到 a.o 的過程叫編譯 過程
a.o 到 a.exe 的過程叫 連接過程(link)
a.o 到 liba.a/so 的過程叫 lib過程 [注:實(shí)在不知道怎么翻譯;( ]
bud 默認(rèn)會(huì)把有main()或者Winmain()函數(shù)的源程序編譯成可執(zhí)行文件;
如果沒有這兩個(gè)函數(shù),則會(huì)被編譯成鏈接庫文件(.a)
下面這些選項(xiàng)可以改變這些行為:
不知道怎么生成 .so的文件?
- -obj 只是創(chuàng)建 object文件(.o),不進(jìn)行l(wèi)ink和lib操作,等同于同時(shí)加 -nolink -nolib
- -link 即使源文件中沒有main()函數(shù),也強(qiáng)制進(jìn)行連接。
- main()函數(shù)一般在鏈接庫中,而不在要編譯的源代碼中
- -nolink 針對(duì)有main()函數(shù)的源文件:不進(jìn)行l(wèi)ink操作,只生成 .o 文件
- -lib 針對(duì)有main()函數(shù)的源文件:不進(jìn)行l(wèi)ink操作,只生成 .a 文件
- -nolib 針對(duì)沒有main()函數(shù)的源文件:不進(jìn)行l(wèi)ib操作,只生成 .o 文件
- -allobj 不懂:(
- -LIBOPT 指定要連接的參數(shù)
- -LIBPATH 指定鏈接庫的目錄
- -PP 指定除當(dāng)前路徑外的 其他源文件的搜索路徑
舉例吧:
- #-obj:只生成.o 文件
- bud a.d -obj # 會(huì)同時(shí)生成 a.o b.o
- bud b.d -obj # 生成 b.o,不會(huì)生成 a.o ;)
- #-link:強(qiáng)制連接
- bud a.d -obj # 生成 a.o
- bud b.d a.o # 生成 b 可執(zhí)行文件
- #-nolink:不鏈接
- bud a.d -nolink # 生成 a.o
- #-lib:生成 靜態(tài)庫
- bud a.d -lib # 生成 a.a 為何不是liba.a?
- #-nolib: 不生成 靜態(tài)庫
- bud b.d -nolib # 生成 b.o ,而不是 b.a
LIZBOPT的作用不大清楚,把原文的定義列出來吧,偷懶了
-LIBOPT
This allows you to pass one or more command line arguments to the librarian.
- Example: Set the page size to 32Kb
- -LIBOPT-p32
- Example: Embedded spaces enclosed in quotes.
- "-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:
- -LIBPATH=c:\mylibs;d:\3rdparty;c:\lib\debuglibs
- BPATH=/usr/lib:/usr/local/lib:/usr/local/lib/mysql/
-PP 舉例:
把b.d 文件移動(dòng) / 目錄下,用bud a.d 編譯就會(huì)提示找不到b.d,ok
- bud a.d -PP/ # 提示找不到 /b.o,因?yàn)榫幾g的b.o生成在了當(dāng)前目錄,而不是根目錄
- bud a.d -PP/ -op # 方案1:op是dmd的編譯參數(shù),表示在源文件的路徑下生成.o文件
- bud a.d -PP/ -odobj # 方案2:把.o文件都輸出到 obj 目錄下
dmd命令的-L參數(shù):指定
- -L 指定一個(gè)連接參數(shù),比如:
- -L-lpthread linux下鏈接libpthread.so
brf文件使用說明
brf文件就是定義了各種bud命令參數(shù)的集合。
文件擴(kuò)展名是:.brf
舉例:
文件名:final.brf
- # 生成發(fā)行版本 # #符號(hào)是brf文件的注釋符號(hào)
- -T{Target}_release # 應(yīng)用程序的名字
- -release # Don't generate runtime checks.
- -full # 重新編譯所有文件
- -cleanup # 編譯完成后清除中間文件
- -inline # 進(jìn)行內(nèi)聯(lián)優(yōu)化
運(yùn)行方法:
- bud a @final # 注意@符號(hào)
- bud a @final --inline
- # 把inline選項(xiàng)禁用;有警告,不知道原因;(
可以把源文件寫到 brf 文件中
每行一個(gè)編譯參數(shù),沒有順序
可以用 -- 選項(xiàng),把brf文件中的參數(shù)禁用了
不可以像Makefile文件一樣,定義多個(gè)編譯目標(biāo)。定義多個(gè)brf文件吧
bud命令的默認(rèn)brf文件叫 build.brf,如果要使用默認(rèn)的brf,則可以不用指定文件名:
- bud @
多放幾個(gè)例子上來,備忘:
來自:http://dlang.group.javaeye.com/group/topic/1072?page=6
- -cleanup 編譯后清理掉.o文件
- -L-lpthread linux下鏈接libpthread.so
- -LIBPATH=c:\db 設(shè)置庫鏈接路徑
- libdb45.lib 直接鏈接windows下使用的lib文件
- -op .o文件輸出到源文件所在路徑
- -odobjs 把.o文件輸出到objs文件夾
- -T../bin/test 編譯的可執(zhí)行文件輸出路徑
# 一個(gè)簡單的make.brf 文件
- -cleanup
- -op
- -L-ldb
- -LIBPATH=/home/lijie/dm/lib:/home/lijie/dmd/lib:/usr/local/BerkeleyDB.4.5/lib
- src/test.d
- -T../bin/test
其他bud參數(shù)
如果沒有給出定義,就自己看文檔吧,我也不大理解 ;)
- -DCPATH 指定編譯器的安裝路徑
- -CFPATH 指定D配置文件的路徑
- -BCFPATH 指定Bud配置文件的路徑
- -RDF<file> 指定RDF文件(Rule Definition File)的路徑
- -MDF<file> 指定MDF文件(Macro Definition File)的路徑
- -nodef 不創(chuàng)建 MDF(Module Definition File)文件
- -explicit 只編譯指定的文件
- -usefinal
- -dll 如果源文件有DllMain()函數(shù),默認(rèn)會(huì)編譯成Dll庫;...
- -gui 如果源文件有WinMain()函數(shù),默認(rèn)會(huì)編譯成GUI程序;...
- -help 顯示幫助
- -AutoWinLibs(=<Yes/No>)
- -modules(=<name>)
- -UMB=<Yes/No>
- -R<option>
- -emptyargs
- -M<name>
- -X<name>
Bud的編譯安裝
下載源程序
make -f Makefile.unix
./build build -full -op
ln -s build bud
后記:
因?yàn)槲抑皇怯肈寫寫測試程序, 基本上就2、3個(gè)文件,最多有個(gè)C的鏈接庫。
我的這點(diǎn)小需求,bud命令還是能很好處理的。更復(fù)雜的情況,我就不了解。
文中有些錯(cuò)誤,和不肯定的地方,等我弄明白了再來修正吧。
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】