• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            Linux下靜態(tài)鏈接庫的制作與使用

            Posted on 2009-08-24 23:20 Prayer 閱讀(7211) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX

            Linux 中的應(yīng)用程序以以下兩種方式之一鏈接到外部函數(shù):要么在構(gòu)建時與靜態(tài)庫( lib*.a)靜態(tài)地鏈接,并且將庫代碼包含在該應(yīng)用程序的可執(zhí)行文件里;要么在運行時與共享庫( lib*.so)動態(tài)地鏈接。通過動態(tài)鏈接裝入器,將動態(tài)庫映射進應(yīng)用程序的可執(zhí)行內(nèi)存中。在啟動應(yīng)用程序之前,動態(tài)鏈接裝入器將所需的共享目標庫映射到應(yīng)用程序的內(nèi)存,或者使用系統(tǒng)共享的目標并為應(yīng)用程序解析所需的外部引用。現(xiàn)在應(yīng)用程序就可以運行了。

             

            先介紹靜態(tài)庫:

            靜態(tài)函數(shù)庫實際上就是簡單的一個普通的目標文件的集合,一般來說習慣用“.a”作為文件的后綴。可以用ar這個程序來產(chǎn)生靜態(tài)函數(shù)庫文件。Ar archiver的縮寫。靜態(tài)函數(shù)庫現(xiàn)在已經(jīng)不在像以前用得那么多了,主要是共享函數(shù)庫與之相比較有很多的優(yōu)勢的原因。慢慢地,大家都喜歡使用共享函數(shù) 庫了。不過,在一些場所靜態(tài)函數(shù)庫仍然在使用,一來是保持一些與以前某些程序的兼容,二來它描述起來也比較簡單。

            靜態(tài)庫函數(shù)允許程序員把程序link起來而不用重新編譯代碼,節(jié)省了重新編譯代碼的時間。不過,在今天這么快速的計算機面前,一般的程序的重新 編譯也花費不了多少時間,所以這個優(yōu)勢已經(jīng)不是像它以前那么明顯了。靜態(tài)函數(shù)庫對開發(fā)者來說還是很有用的,例如你想把自己提供的函數(shù)給別人使用,但是又想 對函數(shù)的源代碼進行保密,你就可以給別人提供一個靜態(tài)函數(shù)庫文件。理論上說,使用ELF格式的靜態(tài)庫函數(shù)生成的代碼可以比使用共享函數(shù)庫(或者動態(tài)函數(shù) 庫)的程序運行速度上快一些,大概15%。

            假設(shè)有下面幾個文件:String.hStrlen.cStrlnen.c
            String.h
            ,聲明相關(guān)函數(shù)原形;
            /***********************************
            Filename : String.h
            Description :
            Author   : HCJ
            Date     : 2006-5-7
            ************************************/
            int Strlen(char *pStr);
            int StrNlen(char *pStr, unsigned long ulMaxLen);

            Strlen.c:函數(shù)Strlen的實現(xiàn),獲取給定字符串的長度;
            /**************************************
            Filename    : get string length
            Description :
            Author      : HCJ
            Date        : 2006/5/7
            **************************************/
            #include<stdio.h>
            #include<assert.h>
            int Strlen(char *pStr)
            {
                unsigned long ulLength;
                assert(NULL != pStr);

                ulLength = 0;
                while(*pStr++)
                {
                    ulLength++;
                }
                return ulLength;
            }

            Strlnen.c:函數(shù)StrNlen的實現(xiàn),獲取給定字符串的長度,如果輸入字符串的長度大于指定的最大長度,則返回最大長度,否者返回字符串的實際長度;
            /**********************************************
            Fileneme: mystrnlen.c
            Description: get input string length,if string large
                         max length input return max length,
                         else real length
            Author: HCJ
            Date : 2006-5-7
            **********************************************/
            #include<stdio.h>
            #include<assert.h>

            int StrNlen(char *pStr, unsigned long ulMaxLen)
            {
                unsigned long ulLength;
                assert(NULL != pStr);
                if(ulMaxLen <= 0)
                {
                    printf("Wrong Max Length!\n");
                    return -1;
                }
                ulLength = 0;
                while(*pStr++ && ulLength < ulMaxLen)
                {
                    ulLength++;
                }
                return ulLength;
            }

            生成靜態(tài)鏈接庫:
            利用GCC生成對應(yīng)目標文件:
            #>gcc –c Strlen.c Strnlen.c
            如果對應(yīng)的文件沒有錯誤,gcc會對文件進行編譯生成Strlen.oStrnlen.o兩個目標文件(相當于windows下的obj文件)。然后用ar創(chuàng)建一個名字為libstr.a的庫文件,并把Strlen.o Strnlen.o的內(nèi)容插入到對應(yīng)的庫文件中。,相關(guān)命令如下:
            #>ar –rc libstr.a Strlen.o Strnlen.o
            命令執(zhí)行成功以后,對應(yīng)的靜態(tài)庫libstr.a已經(jīng)成功生成。

            靜態(tài)庫的使用:
            假設(shè)有下面的文件要使用對應(yīng)的的靜態(tài)庫:
            編譯生成對應(yīng)的目標文件:

            #>gcc -c -I/home/hcj/xxxxxxxx main.c
            生成可執(zhí)行文件:
            #>gcc -o main1 -L/home/hcj/xxxxxxxx main.o libstr.a
            其中-I/home/hcj/xxxxxxxx-L/home/hcj/xxxxxxxx是通過-I-L指定對應(yīng)的頭文件和庫文件的路徑。libstr.a是對應(yīng)的靜態(tài)庫的名稱。這樣對應(yīng)的靜態(tài)庫已經(jīng)編譯到對應(yīng)的可執(zhí)行程序中。執(zhí)行對應(yīng)的可執(zhí)行文件便可以對應(yīng)得函數(shù)調(diào)用的結(jié)果。

            /*****************************************
            FileName: main.c
            Description: test static/dynamic library
            Author: HCJ
            Date : 2005-5-7
            ******************************************/
            #include<stdio.h>
            #include “String.h”   //
            靜態(tài)庫對應(yīng)函數(shù)的頭文件

            int main(int argc, char* argv[])
            {
                char str[] = {"hello world"};
                unsigned long ulLength = 0;

                printf("The string is : %s\n", str);
                ulLength = Strlen(str);
                printf("The string length is : %d(use Strlen)\n", ulLength);
                ulLength = StrNlen(str, 10);
                printf("The string length is : %d(use StrNlen)\n", ulLength);

                return 0;
            }

            這篇文章也不錯,就是不太整潔:

            99久久精品国产综合一区| 一本色综合久久| 精品久久久久久亚洲精品| 亚洲AV日韩精品久久久久 | 精品一区二区久久久久久久网站| AAA级久久久精品无码片| 91精品观看91久久久久久| 色天使久久综合网天天| 久久精品国产亚洲AV无码娇色| 日本福利片国产午夜久久| 思思久久好好热精品国产| 国产成人久久AV免费| 亚洲欧洲中文日韩久久AV乱码| 国产精品一久久香蕉国产线看观看 | 94久久国产乱子伦精品免费| 久久笫一福利免费导航| 2021少妇久久久久久久久久| 亚洲精品乱码久久久久久蜜桃| 精品久久久久久综合日本| 亚洲欧美日韩精品久久亚洲区 | 欧美精品九九99久久在观看| 91精品国产综合久久精品| 精品久久久一二三区| 国产亚州精品女人久久久久久| 亚洲αv久久久噜噜噜噜噜| 久久综合亚洲色HEZYO国产| 青青青国产成人久久111网站| 亚洲狠狠婷婷综合久久蜜芽 | 久久久久亚洲AV无码麻豆| 久久久久久A亚洲欧洲AV冫| 婷婷久久综合九色综合98| 久久婷婷国产综合精品| 精品无码久久久久国产动漫3d| 久久婷婷五月综合色99啪ak| 久久93精品国产91久久综合| 国产亚洲欧美成人久久片 | 国产成人久久精品一区二区三区| 久久精品无码专区免费| 狠狠色综合久久久久尤物| 91久久精品电影| 久久亚洲高清综合|