看大多數說的都是簡單地將整個工程轉換成.LIB,在Project->Options for Target->Output下,選擇Create Library,就能夠了。windows
不過這樣生成的lib文件巨大,我如今編譯的工程最後生成的lib有2.6MB。函數
若只想將工程中的單個c文件生成相應的lib文件ui
一、右鍵點擊工程,假設爲a,選Add Group,假設爲b,再將想生成lib的文件加入b group,假設文件是cc.c,必需要有cc.h。this
二、右鍵依次點擊其餘的group,按KEIL官網資料所說的,將Options for Group->Properties下的Include in Target Build前的對勾去掉,這樣生成LIB時就不會被編譯了spa
三、Project->Options for Target->Output下,選擇Create Library,改輸出文件名爲cc,點OKcode
四、編譯,這樣就能在工程文件夾下的OBJ找到生成的cc.lib了,我在裏面只放了一個函數,大小爲80K。內存
五、調用也要注意,將cc.lib拷貝到source文件夾下,將其添加到main group中,並刪掉以前的cc.c,要使用cc.lib時,必需要保證c文件中include 「cc.h」。固然在以前寫cc.c中也要include 「cc.h」,而且cc.h中聲明瞭cc.c中的函數才行。最後要將剛纔去掉對勾的部分都還原,編譯,OK!文檔
備註要點:get
一、 生成lib 的工程能夠沒有main函數,能夠只有一個.c文件,一個.c文件中能夠只有一個函數 。
二、 須要在lib工程中創建一個.h文件, 必須用extern聲明各全局變量和函數。
三、 調用lib文件的工程中必須包括lib中的.h文件, 也就是lib工程和調用工程都包含同一個.h文件(好像有點廢話) 。it
四、Lib的文件要分的細一點,沒有調用關係的兩個函數不要放到同一個C文件中. 沒有調用關係的最好是一個函數單獨放在一個.c文件中.這是爲了不在keil中應用程序調用lib庫裏出現告警. 由於LIB51在連接的時候是按模塊來連接的,一個模塊就對應一個C文件,假如連接器由於要使用你一個函數fA而引入了A模塊,那麼A模塊中的另外的函數也會被引入,而另外的函數你又沒有使用的話,那麼就會引起Keil經典的UNCALLED FUNC的warning。一般爲每個函數編一個.C文件,而整個lib用一個.h文件,這樣就可使只有被調用的函數參與鏈接 。這個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。
五、調用lib庫時須要在工程中將.lib文件加進來. 在Group中右鍵,而後Add ,注意文件類型中選擇*.lib。
六、Startup和中斷處理程序不要封入LIB,這些程序會在連接的時候產生問題。具體的緣由麼,有點複雜,應該是中斷程序的link機制有所不一樣的關係吧。