• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Linux下靜態鏈接庫的制作與使用

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

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

             

            先介紹靜態庫:

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

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

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

            Strlen.c:函數Strlen的實現,獲取給定字符串的長度;
            /**************************************
            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:函數StrNlen的實現,獲取給定字符串的長度,如果輸入字符串的長度大于指定的最大長度,則返回最大長度,否者返回字符串的實際長度;
            /**********************************************
            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;
            }

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

            靜態庫的使用:
            假設有下面的文件要使用對應的的靜態庫:
            編譯生成對應的目標文件:

            #>gcc -c -I/home/hcj/xxxxxxxx main.c
            生成可執行文件:
            #>gcc -o main1 -L/home/hcj/xxxxxxxx main.o libstr.a
            其中-I/home/hcj/xxxxxxxx-L/home/hcj/xxxxxxxx是通過-I-L指定對應的頭文件和庫文件的路徑。libstr.a是對應的靜態庫的名稱。這樣對應的靜態庫已經編譯到對應的可執行程序中。執行對應的可執行文件便可以對應得函數調用的結果。

            /*****************************************
            FileName: main.c
            Description: test static/dynamic library
            Author: HCJ
            Date : 2005-5-7
            ******************************************/
            #include<stdio.h>
            #include “String.h”   //
            靜態庫對應函數的頭文件

            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久久综合狠狠综合久久| 久久综合亚洲鲁鲁五月天| 久久精品九九亚洲精品| 77777亚洲午夜久久多喷| 国产午夜精品理论片久久影视| 国产99久久久久久免费看| 一本色道久久88综合日韩精品 | 久久精品国产免费| 久久久久国产精品嫩草影院| 无码任你躁久久久久久老妇App| 久久综合综合久久综合| 久久成人18免费网站| 亚洲AV无一区二区三区久久| 人人狠狠综合久久亚洲婷婷| 久久这里只有精品首页| 91精品婷婷国产综合久久| 久久九九兔免费精品6| 国产午夜电影久久| 国产精品无码久久综合| 漂亮人妻被中出中文字幕久久 | 99久久婷婷国产综合精品草原| 亚洲性久久久影院| 久久精品国产一区二区三区| 成人久久综合网| 奇米影视7777久久精品| 久久久久亚洲AV无码专区桃色| 国产精品久久国产精品99盘 | 久久久久久综合一区中文字幕 | 久久精品国产清自在天天线| 狠狠色丁香久久综合五月| 久久狠狠爱亚洲综合影院| 欧美午夜精品久久久久久浪潮| 久久91精品国产91久久麻豆| 久久久噜噜噜久久熟女AA片| 无码人妻久久一区二区三区| 久久久久国产精品嫩草影院| 老男人久久青草av高清| 亚洲狠狠婷婷综合久久久久| 一本一本久久A久久综合精品 | 999久久久免费国产精品播放| 国产精品久久久久影院色|