• <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 旅途 閱讀(9423) 評論(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 喬方杰

            寫的很好啊  回復  更多評論   

            99久久成人国产精品免费| 久久亚洲AV无码西西人体| 伊人久久大香线蕉av不变影院| 思思久久99热只有频精品66| 亚洲AV无码久久| 久久国产精品波多野结衣AV| 欧美国产成人久久精品| 亚洲精品国产字幕久久不卡 | 俺来也俺去啦久久综合网| 国产精品99久久久久久猫咪| 久久热这里只有精品在线观看| 99国产精品久久久久久久成人热| 久久精品国产精品亚洲人人 | 91精品婷婷国产综合久久| 免费久久人人爽人人爽av| 日本道色综合久久影院| 婷婷伊人久久大香线蕉AV | 亚洲午夜无码AV毛片久久| 国内精品久久久久久99蜜桃| 久久成人小视频| 日日狠狠久久偷偷色综合0| 久久精品国产亚洲沈樵| 久久这里只有精品18| 亚洲精品97久久中文字幕无码| 97久久精品人人做人人爽| 久久精品亚洲一区二区三区浴池| 久久久久亚洲AV无码专区首JN | 久久婷婷国产综合精品 | 色88久久久久高潮综合影院| 久久综合色之久久综合| 国内精品久久久久久久涩爱| 亚洲国产精品久久久久网站| 九九精品99久久久香蕉| 狠色狠色狠狠色综合久久| 久久精品国产亚洲AV无码麻豆| 午夜精品久久久久久中宇| 亚洲中文久久精品无码| 久久综合狠狠综合久久| 精品人妻久久久久久888| 精品久久久久久亚洲精品 | 久久人人爽人人爽人人AV东京热 |