1. 程式人生 > >KEIL MDK 下為單一C檔案生成.LIB檔案以及注意事項

KEIL MDK 下為單一C檔案生成.LIB檔案以及注意事項

操作步驟:

1、右鍵點選工程,假設為a,選Add Group,假設為b,再將想生成lib的檔案加入b group,假設檔案是cc.c,必須要有cc.h。

2、右鍵依次點選其他的group,按KEIL官網資料所說的,將Options for Group->Properties下的Include in Target Build前的對勾去掉,這樣生成LIB時就不會被編譯了。

3、Project->Options for Target->Output下,選擇Create Library,改輸出檔名為cc,點OK。

4、編譯,這樣就能在工程資料夾下的OBJ找到生成的cc.lib了,如果我們在裡面只放了一個C檔案的話,那麼就可以生成這個C檔案的lib庫。


5、呼叫也要注意,將cc.lib拷貝到source資料夾下,將其新增到main group中,並刪掉之前的cc.c,要使用cc.lib時,必須要保證c檔案中include “cc.h”。當然在之前寫cc.c中也要include “cc.h”,並且cc.h中聲明瞭cc.c中的函式才行。最後要將剛才去掉對勾的部分都還原,編譯,OK!

注意事項:

       首先,Startup和中斷處理程式不要封入LIB,這些程式會在連結的時候產生問題。具體的原因麼,有點複雜,應該是中斷程式的link機制有所不同的關係吧。其次,Lib的檔案要分的細一點,沒有呼叫關係的兩個函式不要放到同一個C檔案中,因為LIB51在連結的時候是按模組來連結的,一個模組就對應一個C檔案,假如連結器因為要使用你一個函式fA而引入了A模組,那麼A模組中的另外的函式也會被引入,而另外的函式你又沒有使用的話,那麼就會引發Keil經典的UNCALLED FUNC的warning。

這個warning在Keil的文件中說的很清楚,有興趣的可以看一下下面的原文:

It is common practice during the development process to write but not call additional functions.  While the compiler permits this without error, the Linker/Locator does not treat this code casually because of the support for data overlaying, and emits a warning message. Interrupt functions are never called, they are invoked by the hardware.  An uncalled routine is treated as a potential interrupt routine by the linker.  This means that the function is assigned non-overlayable data space for its local variables.  This quickly exhausts all available data memory (depending upon the 
memory model used). If you unexpectedly run out of memory, be sure to check for linker warnings relating to uncalled or unused routines.  You can use the linker’s IXREF directive to include a cross reference list in the linker map  (.M51)  file.

大意就是說,Keil的記憶體應用模式是指定地址的,也就是要根據呼叫關係來決定哪塊地址可以被複用。對於這種沒人呼叫的函式,Keil會認為是中斷處理程式,並不能決定呼叫關係,所以此類uncalled函式的空間不能和其他的程式共享,也就是說,這函式用多少RAM,你就少多少RAM。那uncall多了就會造成記憶體溢位了。

所以,lib的功能可以做的大而全,但是裡面的模組一定要分的要多細,有多細,只有這樣,你才能像在windows上用CRT一樣舒服的使用LIB。