1. 程式人生 > >Keil5.15使用GCC編譯器鏈接.a庫文件

Keil5.15使用GCC編譯器鏈接.a庫文件

.net dex 函數聲明 header tracking ive 文章 之前 分享

我們知道,當使用第三方的代碼時,人家有可能會扔個Lib文件給你.這時候,別人僅僅要提供header文件給你,則你就能夠通過Lib文件及header的函數聲明,對Lib中的函數進行調用.在Keil中假設使用ARMCC調用Lib文件,相信大家都能從網上找到方法.那假設在Keil中使用GCC來鏈接第三方GCC編譯好的Lib文件——".a"應該怎樣呢?

在告訴大家方法之前,我們寫個簡單的函數,然後用GCC編譯器編譯產生.a文件,便於我們進行測試.
首先,在Keil中配置gcc編譯環境,這個能夠參考我的文章.

Keil5.15使用GCC編譯器編譯STM32project,裏面有交大家配置方法.
接下來,將project配置成生成庫方式.這個跟Keil ARMCC的方式非常像.
技術分享


最後,寫上自己測試代碼.
庫文件的NiipLib.c文件代碼:

int NiipLib_GetValue(unsigned char* pBuffer,int nSize)
{
    int nIndex = 0;
    for(nIndex = 0;nIndex <nSize;nIndex++)
    {
            pBuffer[nIndex] = nIndex;
    }
    return nIndex;
}

庫文件的NiipLib.h文件代碼:

#ifdef __cplusplus
extern "C" {
#endif
int
NiipLib_GetValue(unsigned char* pBuffer,int nSize); #ifdef __cplusplus } #endif
點擊編譯,我們能夠在編譯輸出文件夾下得到"libNiipLib.a"文件.接著,我們就要在另外個project引用這個庫文件了.

將"libNiipLib.a"文件與"NiipLib.h"復制到自己新建的或者已存在的項目以下.以下圖片的重點來了,請大家留意一下,開始"找不同"或者"大家來找茬".

技術分享

細心的人,會發現為什麽我"Include Libraries"這個地方,為什麽填寫的是"NiipLib"為什麽不是"libNiipLib.a"?

事實上,我開始也填寫"libNiipLib.a",但編譯器老提示無法找到"libNiipLib.a"這個文件.我真的想說FUCK.在網上搜索了一下,發現GCC有個變態的情況,叫做"隱式約定命名規則". 什麽叫做"隱式約定命名規則"?用別人的解釋

-ltest 表示要鏈接動態庫libtest.a文件,這是gcc隱式約定命名規則。也就是庫名帶lib頭,比方libtest.a,而在鏈接參數上則不帶,比方-ltest就表示要鏈接libtest.a

而我的理解就是,你要調用什麽.a文件,你僅僅需去掉文件名稱前綴的"lib"及後綴的".a",就能夠了。


測試結果:

技術分享

來自:http://blog.csdn.net/lan120576664

Keil5.15使用GCC編譯器鏈接.a庫文件