• <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編譯生成動態(tài)鏈接庫*.so文件的方法。

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

            下面通過一個例子來介紹如何生成一個動態(tài)庫。這里有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們將這幾個文件編譯成一個動態(tài)庫: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");

            }



            將這幾個文件編譯成一個動態(tài)庫:libtest.so



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


            2、動態(tài)庫的鏈接

            在1、中,我們已經(jīng)成功生成了一個自己的動態(tài)鏈接庫libtest.so,下面我們通過一個程序來調(diào)用這個庫里的函數(shù)。程序的源文件為:test.c。

            test.c:



            #include "so_test.h"



            int main()

            {

            test_a();

            test_b();

            test_c();



            return 0;

            }



            l 將test.c與動態(tài)庫libtest.so鏈接生成執(zhí)行文件test:



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



            l 測試是否動態(tài)連接,如果列出libtest.so,那么應(yīng)該是連接正常了



            $ ldd test



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

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

            l -L.:表示要連接的庫在當(dāng)前目錄中

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

            l LD_LIBRARY_PATH:這個環(huán)境變量指示動態(tài)連接器可以裝載動態(tài)庫的路徑。

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

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

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

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

            Feedback

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

            不錯,謝謝  回復(fù)  更多評論   

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

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

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

            寫的很好啊  回復(fù)  更多評論   

            浪潮AV色综合久久天堂| 国产一区二区精品久久凹凸| 久久久久亚洲爆乳少妇无| 亚洲精品国精品久久99热| 欧美噜噜久久久XXX| 精品国产乱码久久久久久郑州公司 | 久久人人爽人人爽人人片AV不 | 久久精品一区二区国产| 久久人人爽人人爽人人片AV高清| 狠狠色综合网站久久久久久久高清| 丁香五月综合久久激情| 亚洲国产精品无码久久| 亚洲精品午夜国产va久久| 精品熟女少妇a∨免费久久| 精品人妻伦一二三区久久| 久久久久亚洲AV成人片| 久久九九久精品国产免费直播| 久久精品国产亚洲AV嫖农村妇女| 久久久久久久久久久免费精品| 久久久久久A亚洲欧洲AV冫| 99久久99这里只有免费费精品| 亚洲∧v久久久无码精品| 久久婷婷五月综合97色直播| 久久精品这里热有精品| 欧美va久久久噜噜噜久久| 伊人久久大香线蕉综合5g| 欧美久久亚洲精品| 久久人妻AV中文字幕| 亚洲欧美国产精品专区久久| 国产精品美女久久久免费| 久久青草国产手机看片福利盒子| 久久午夜伦鲁片免费无码| 婷婷伊人久久大香线蕉AV| 久久精品青青草原伊人| 无码任你躁久久久久久老妇App| 精品国产青草久久久久福利| 亚洲欧洲久久久精品| 久久精品国产欧美日韩99热| 久久精品国产精品亚洲精品 | 国产91色综合久久免费| 亚洲精品乱码久久久久久久久久久久 |