詳情請看:
JLPT
誠徵各路勇者(?)一起參加~
TAG
首都機能移轉
(2)
歌詞
(2)
靠北文
(40)
戲言
(30)
糟糕
(7)
ACG
(23)
Assembly
(2)
Boost
(2)
C
(31)
C++
(69)
CMake
(4)
CSIE
(67)
Debian
(34)
Design_Pattern
(2)
Django
(1)
Eclipse
(1)
en_US
(13)
FFmpeg
(3)
FoolproofProject
(26)
FreeBSD
(2)
Git
(4)
GNU_Linux
(65)
IDE
(5)
Java
(11)
JavaScript
(19)
KDE
(15)
Khopper
(16)
KomiX
(3)
Kubuntu
(18)
Life
(1)
Lighttpd
(2)
Mac_OS_X
(2)
Opera
(1)
PHP
(2)
PicKing
(2)
Programing
(21)
Prolog
(1)
Python
(7)
QSnapshot
(2)
Qt
(30)
Qt_Jambi
(1)
Regular_Expression
(1)
Shell_Script
(7)
Talk
(98)
VirtualBox
(7)
Visual_Studio
(13)
Windows
(18)
zh_TW
(36)
2007年8月23日 星期四
2007年8月20日 星期一
如何寫作makefile
在Unix系統上編譯tarball時,通常需要三步驟:
Makefile的概念非常像是批次檔,但是它有更強大的能力。
make會查閱每一步驟所需要的檔案,如果沒有便執行指令以產生該檔案,如果已經是最新狀態,就直接跳到下個步驟。撰寫者只要了解原始碼的編譯步驟,就可以依序寫好指令,如此只要有Makefile,不管是誰只要鍵入make就可以成功編譯出檔案。
./configure make make install這中間的make指令便是利用makefile來處理編譯步驟。
Makefile的概念非常像是批次檔,但是它有更強大的能力。
make會查閱每一步驟所需要的檔案,如果沒有便執行指令以產生該檔案,如果已經是最新狀態,就直接跳到下個步驟。撰寫者只要了解原始碼的編譯步驟,就可以依序寫好指令,如此只要有Makefile,不管是誰只要鍵入make就可以成功編譯出檔案。
以最簡單的單一檔案來說,編譯指令應該如下:
這樣會把helloworld.c編譯為helloworld這個執行檔。
而若要寫為makefile,可以這麼寫:
上面的意義為,要完成all這個目標,需要helloworld這個檔案,如果找不到它,就執行
注意,all是個關鍵字,良好的makefile都要有一個all,因為這是預設執行目標。
且一定要用tab縮排,否則它不會認目標底下的指令。換行符號也請用Unix的換行符。
gcc helloworld.c -o helloworld
這樣會把helloworld.c編譯為helloworld這個執行檔。
而若要寫為makefile,可以這麼寫:
all: helloworld gcc helloworld.c -o helloworld檔名存為Makefile或是makefile都可以[?],這就是最簡單的makefile。
上面的意義為,要完成all這個目標,需要helloworld這個檔案,如果找不到它,就執行
gcc helloworld.c -o helloworld
這個指令。注意,all是個關鍵字,良好的makefile都要有一個all,因為這是預設執行目標。
且一定要用tab縮排,否則它不會認目標底下的指令。換行符號也請用Unix的換行符。
若是要編譯多個檔案呢?比方說現在有三個檔案:application.c, interface.h, implementation.c,application.c引用了interface.h的函式,而implementation.c則是interface.h的實作。
先來看一下平常編譯該怎麼編:
所以來整理一下:result檔需要implementation.o和application.o這兩個檔案,而這兩個檔案分別需要implementation.c和application.c,如此一來就會變成:
你也可以選擇只執行其中一個目標,像是
先來看一下平常編譯該怎麼編:
gcc -c application.c
gcc -c implementation.c
gcc implementation.o application.o -o result
這樣編譯出來的result就是可執行檔。所以來整理一下:result檔需要implementation.o和application.o這兩個檔案,而這兩個檔案分別需要implementation.c和application.c,如此一來就會變成:
all: result
result: implementation.o application.o
gcc implementation.o application.o -o result
implementation.o: implementation.c
gcc -c implementation.c
application.o: application.c
gcc -c application.c
意即:欲完成all需要先完成result目標,欲完成result需要先完成implementation.o和application.o這兩個目標,而要達成implementation.o和application.o則分別需要implementation.c和application.c這兩個檔案。你也可以選擇只執行其中一個目標,像是
make application.o
就只會產生application.o檔。
總而言之,makefile的基本型式是:
而且目標也不一定要有前置目標,如果執行的目標沒有前置目標的話,代表目標底下的命令一定會執行。
target: required file or target
commands to complete this target
底下不限定有多少行指令,只要有用tab縮排即可。而且目標也不一定要有前置目標,如果執行的目標沒有前置目標的話,代表目標底下的命令一定會執行。
如果你覺得太長,想省略一點,也可以用萬用符號[?]:
all: result
result: *.o
gcc *.o -o result
*.o: *.c
gcc -c *.c
這個版本可以跟上面的版本達到相同的效果,不過當然有點危險就是了。
當然不只能用來編譯,也許你會希望能夠有清掉過程檔的功能:
all: result clean
result: *.o
gcc *.o -o result
*.o: *.c
gcc -c *.c
clean:
rm -f *.o
這樣在下完make
之後會立刻把所有的.o檔清除,或是也可以用make clean
除掉。
也許你在編譯完成之後都會執行一次該程式來測試,那麼也可以這麼寫:
當找不到input.txt時,make會自動停止並回報錯誤,因為文件中找不到如何生成input.txt的資訊。
all: result clean
result: *.o
gcc *.o -o result
*.o: *.c
gcc -c *.c
clean:
rm -f *.o
test: result input.txt
./result <input.txt
如此只要輸入make test
就會自動執行測試。當找不到input.txt時,make會自動停止並回報錯誤,因為文件中找不到如何生成input.txt的資訊。
儘管make沒有明定什麼目標該做什麼事,但是在約定成俗的目標上,請按照慣例:
其他經常用的目標也請不要逆天。
make all
要用來生成所有程式。make install
要用來安裝程式。make clean
要用來清除暫時檔。其他經常用的目標也請不要逆天。
當然這只是最最簡單的makefile,其他如關鍵字聲明之類的,可以去翻make的文件;而automake這套程式可以幫助你生成大型專案的makefile,不過我笨,不會用(汗)。
2007年8月17日 星期五
2007年8月15日 星期三
RubyText (library) 2.3.1 released
Downdoad:
License:
LGPLRelease Note:
- 2.2.0:
- Interface changed: 所有功能歸類至RubyText底下:
- RubyText.generate( string ):創造<ruby>標籤
- RubyText.restore( string ):移除<ruby>標籤
- RubyText.clear( string ):移除注音文字
- Interface changed: 所有功能歸類至RubyText底下:
- 2.2.1:
- Core improved: 改變尋找子字串方式,現在所有功能都不再依賴其他函式庫。
- 2.2.2:
- Bugfix: 修正有可能對非字串元素做處理的問題。
- Bugfix: 修正此函式庫不使用在網頁上時的通用性問題。
- Core improved: 改進尋找子字串方式。
- 2.3.0:
- Interface changed: 所有正則表達式濾鏡獨立到RubyText.Filter底下,再以語系分類:
- RubyText.Utility:通用性濾鏡
- RubyText.Utility.RubyTag:取出<ruby><rb><rp><rt>及其結尾標籤
- RubyText.Japanese:日文專用濾鏡
- RubyText.Japanese.KanjiWithHiragana:取出標示平假名的漢字組,格式為「漢字(ひらがな)」
- RubyText.Japanese.HiraganaRT:取出在半形括號內的平假名,格式為「(ひらがな)」
- RubyText.Utility:通用性濾鏡
- Interface changed: 所有正則表達式濾鏡獨立到RubyText.Filter底下,再以語系分類:
- 2.3.1:
- Bugfix: 修正在IE中運行不正常問題
2007年8月13日 星期一
IE socks...
之前就為了IE一個調CSS調到快瘋掉
沒想到剛才改JavaScript又給我碰到一件鳥事...
由於測試時不管怎麼按IE都沒反應
還以為我有什麼地方寫錯了
結果竟然是IE不支援application/javascript這個MIME type
非得用過時的text/javascript才能執行....
某個角度來說,IE還真是讓我大開眼界....
沒想到剛才改JavaScript又給我碰到一件鳥事...
由於測試時不管怎麼按IE都沒反應
還以為我有什麼地方寫錯了
結果竟然是IE不支援application/javascript這個MIME type
非得用過時的text/javascript才能執行....
某個角度來說,IE還真是讓我大開眼界....
類別:
JavaScript
2007年8月12日 星期日
2007年8月11日 星期六
Ruby Tag Auto Creator 2.1.0.0 released!
Link:
Ruby Tag Auto Creator 2.1.0.0Release Note:
Library:
- 更改genRubyTag(), delRubyTag(), delRubyText()的行為,使它們在找不到目標時回傳null,而不會彈出任何信息。
- 變更rubytext.css的載入方式,rubytext.js不再負責CSS的路徑。請在要使用的網頁的<head>裡加入:
<link rel="alternate stylesheet" id="RubyText" type="text/css" href="YOUR rubytext.css PATH" />
<script type="text/javascript" src="YOUR rubytext.js PATH"></script>
紅標的地方是一定要遵守的,另外,CSS的載入也必須在JavaScript之前。
Page interface:
- 將所有網頁元件純粹化。
- 版面設計更動,特別感謝魏藥的大力協助與測試。
Caution:
Safari 2由於其本身若干BUG,如有必要請使用Safari 3 beta以得到最佳效果。2007年8月9日 星期四
刪除所有子目錄底下的同類檔案
今天在寫Java的makefile的時候,在clean這個項目上遇到了困難。
主要是Java的package一定要用子目錄裝,但是
經過一陣子的google之後,發現原來要這麼使:
雖然也可以用find自己的參數-exec,寫成這樣:
不過前者明顯好看很多,而且據說效能也比較好[?]。
主要是Java的package一定要用子目錄裝,但是
rm -rf *.class
這個指令只會把當前目錄的*.class檔刪除而已。經過一陣子的google之後,發現原來要這麼使:
find . -name "*.class" | xargs rm -f
雖然也可以用find自己的參數-exec,寫成這樣:
find . -name "*.class" -exec rm -f {} \;
不過前者明顯好看很多,而且據說效能也比較好[?]。
類別:
Shell_Script
2007年8月1日 星期三
Ruby text auto creater 2.0.0.0 released
Release Note:
- 真正處理ruby text的部分與網頁分離,函式庫己獨立。
- 以CSS實作ruby text呈現,並因應browser不同動態載入CSS;Opera目前未實作、Konqueror無法實作。
- 主頁介面更動
- 版號系統變更:LibraryMainVersion.LibraryMinorVersion.LibraryPatchVersion.PageChangeVersion
Function Library
Ruby text CSS
API:
Rubytext.Version:
Library的版本。Rubytext.URL:
rubytext.css的URL,請照實填寫。genRubyTag( string ):
對string加入ruby tag並回傳。若是無法處理,彈出警告視窗且不做任何更動,回傳string。
delRubyTag( string ):
將string中已加入的ruby tag刪除後回傳。若是無法處理,彈出警告視窗且不做任何更動,回傳string。
delRubyText( string ):
刪除string中的ruby text(半形括弧中的假名)並回傳。若是無法處理,彈出警告視窗且不做任何更動,回傳string。
類別:
CSIE,
FoolproofProject
訂閱:
文章 (Atom)