星期二, 4月 22, 2008

Borland C++ 3.1 link with c startup module and default link library

最近重操舊業,寫起早期的DOS程式,有很多技巧都已經忘光了,所以也吃了不少苦頭。找到原因後,趕緊記錄下來,希望下次再遇到時就不用再摸索一次了。

在IDE的環境,只要將CPP or C 的Source Code加入Prj內,Borland C++會自動將你處理後續的動作。如果要能更有彈性一點,就要自己做了。尤於我要與組合語言撰寫的library連結,所以內建的project management不怎麼適用,所以只好自行撰寫makefile。以command line bcc 先行以 -c 只編譯不 link,最後再一起與assembly object code連結。但是就算只有單純的一個空的main()函式,單純只compiler, link 時仍然需要link C startup module 與run time library。但是怎麼知道startup module 與 run time library 是那一個就有點麻煩了。早期的lanuguage help system 都寫的不太多,總是要猜一下,這樣一猜又猜掉我一天的時間.....

DOS program 有一件事很重要,要注意memory model, 這在32 bit programming 是連聽都沒聽過的事。所以compiler時,就要先指定memory model。以BC++來人說,即是


接下來要Link指明連結link large starup code and run time library, 分別是c0l.obj 與 cl.lib。


其中Link 時切記注意有順序關係的,我因為偷懶,一開始沒有將c0l.obj放在Link裡的第一項,Link雖然沒有錯誤訊息,但是執行是會發生異常現像,為此又搞了一段的時間來解決此問題。

如果不是很確定makefile要怎麼寫,borland++的bin folder內有提供prj2mak.exe 提供將project 檔轉換成makefile。雖然是borland C++ 內附的make utility 在使用的,不過大同小異,參考一下總是有幫助的。