• <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>

            旅途

            如果想飛得高,就該把地平線忘掉

            用gcc編譯生成動態鏈接庫*.so文件的方法。

            動態庫*.so在linux下用c和c++編程時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和鏈接,總算搞懂了這個之前一直不太了解得東東,這里做個筆記,也為其它正為動態庫鏈接庫而苦惱的兄弟們提供一點幫助。
            1、動態庫的編譯

            下面通過一個例子來介紹如何生成一個動態庫。這里有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們將這幾個文件編譯成一個動態庫:libtest.so。

            so_test.h:



            #include

            #include



            void test_a();

            void test_b();

            void test_c();



            test_a.c:



            #include "so_test.h"



            void test_a()

            {

            printf("this is in test_a...\n");

            }



            test_b.c:



            #include "so_test.h"



            void test_b()

            {

            printf("this is in test_b...\n");

            }



            test_a.c:



            #include "so_test.h"



            void test_c()

            {

            printf("this is in test_c...\n");

            }



            將這幾個文件編譯成一個動態庫:libtest.so



            $ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so


            2、動態庫的鏈接

            在1、中,我們已經成功生成了一個自己的動態鏈接庫libtest.so,下面我們通過一個程序來調用這個庫里的函數。程序的源文件為:test.c。

            test.c:



            #include "so_test.h"



            int main()

            {

            test_a();

            test_b();

            test_c();



            return 0;

            }



            l 將test.c與動態庫libtest.so鏈接生成執行文件test:



            $ gcc test.c -L. -ltest -o test



            l 測試是否動態連接,如果列出libtest.so,那么應該是連接正常了



            $ ldd test



            l 執行test,可以看到它是如何調用動態庫中的函數的。
            3、編譯參數解析
            最主要的是GCC命令行的一個選項:
            -shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執行文件

            l -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

            l -L.:表示要連接的庫在當前目錄中

            l -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱

            l LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。

            l 當然如果有root權限的話,可以修改/etc/ld.so.conf文件,然后調用 /sbin/ldconfig來達到同樣的目的,不過如果沒有root權限,那么只能采用輸出LD_LIBRARY_PATH的方法了。
            4、注意

            調用動態庫的時候有幾個問題會經常碰到,有時,明明已經將庫的頭文件所在目錄 通過 “-I” include進來了,庫所在文件通過 “-L”參數引導,并指定了“-l”的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈接的so文件,這時你要作的就是通過修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈接的問題了。

            - 作者: 像風一樣流浪 訪問統計:31 2005年10月11日, 星期二 17:08 加入博采

            posted on 2007-09-29 01:31 旅途 閱讀(9414) 評論(3)  編輯 收藏 引用 所屬分類: Linux開發

            Feedback

            # re: 用gcc編譯生成動態鏈接庫*.so文件的方法。 2010-01-27 14:04 勞工

            不錯,謝謝  回復  更多評論   

            # re: 用gcc編譯生成動態鏈接庫*.so文件的方法。 2010-01-27 14:05 ali

            <script>alert(8);</script>  回復  更多評論   

            # re: 用gcc編譯生成動態鏈接庫*.so文件的方法。 2012-06-16 08:59 喬方杰

            寫的很好啊  回復  更多評論   

            久久久黄片| 久久精品视频免费| 7777久久久国产精品消防器材 | 国产精品美女久久久m| 91久久福利国产成人精品| 深夜久久AAAAA级毛片免费看 | 亚洲中文字幕无码一久久区| 久久99国产精品久久99| 欧美亚洲国产精品久久久久| 狠狠狠色丁香婷婷综合久久五月| 久久久久亚洲AV无码专区网站| 亚洲AV无码成人网站久久精品大| A级毛片无码久久精品免费| 午夜天堂精品久久久久| 亚洲欧美日韩精品久久亚洲区| 色综合久久最新中文字幕| 一本色综合久久| 2021国产成人精品久久| 久久青青草原亚洲av无码app| 亚洲精品99久久久久中文字幕| 精品久久久久久国产牛牛app| 好久久免费视频高清| 久久无码人妻一区二区三区午夜| 久久毛片一区二区| 久久99精品国产麻豆不卡| 91性高湖久久久久| 久久久久久人妻无码| 久久ww精品w免费人成| 亚洲精品tv久久久久久久久| 99久久夜色精品国产网站| 精品久久久中文字幕人妻| 国产香蕉久久精品综合网| 97精品伊人久久大香线蕉| 色综合久久夜色精品国产| 欧美国产成人久久精品| 97精品依人久久久大香线蕉97| 久久精品国产99国产精品亚洲| 久久丫忘忧草产品| 香蕉久久久久久狠狠色| 人妻少妇久久中文字幕一区二区 | 久久99免费视频|