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

            不會飛的鳥

            2010年12月10日 ... 不鳥他們!!! 我要用自己開發的分布式文件系統、分布式調度系統、分布式檢索系統, 做自己的搜索引擎!!!大魚有大志!!! ---楊書童

            Linux下動態加載動態庫,更新動態庫而不用更新程序

            linux下動態加載動態庫,主要用到dlopen(),dlsym(),dlclose(),dlerror()四個函數,他們所使用的頭文件#include <dlfcn.h>
            在這里主要介紹一下dlopen()函數

            dlopen()  功能:打開一個動態鏈接庫

              包含頭文件:

              #include <dlfcn.h>

              函數定義

              void * dlopen( const char * pathname, int mode );

              函數描述:

              在dlopen的()函數以指定模式打開指定的動態連接庫文件,并返回一個句柄給調用進程。使用dlclose()來卸載打開的庫。

              mode:分為這兩種

              RTLD_LAZY 暫緩決定,等有需要時再解出符號

              RTLD_NOW 立即決定,返回前解除所有未決定的符號。

              RTLD_LOCAL

              RTLD_GLOBAL 允許導出符號

              RTLD_GROUP

              RTLD_WORLD

              返回值:

              打開錯誤返回NULL

              成功,返回庫引用

              編譯時候要加入 -ldl (指定dl庫)

              例如

              gcc test.c -o test -ldl


            下面舉個例子,同時考慮到幾個細節。


            /***********************main.c的內容**************************/
            #include<stdio.h>
            #include<dlfcn.h>
            int main()
            {
                int a,b;
                void *pHandle;
               
            typedef int (*func)(int,int);   //注意函數的定義,這里要根據下面的max函數格式定義。
                scanf("%d%d",&a,&b);
                pHandle=dlopen("./dl2.so",RTLD_NOW);
                if (!pHandle)
                {
                        cerr << "Cannot open library: " << dlerror() << ' ';
                        return 1;
                }
               
                func=(func)dlsym(pHandle,"max");
                const char *dlsym_error = dlerror();
                if (dlsym_error) {
                        cerr << "Cannot load symbol 'baidu': " << dlsym_error <<' ';
                        dlclose(pHandle);
                        return 1;
                }

                printf("%d與%d相比,%d為大數。\n",a,b,(*func)(a,b));
                dlclose(pHandle);
            }
            /***********************main.c的內容**************************/

            /***********************testmax.c的內容**************************/
            #include<stdio.h>
            int max(int x,int y)
            {
                return x>y?x:y;
            }
            /***********************testmax.c的內容**************************/

            編譯:
            gcc testmax.c -shared -fPIC -o testmax.so
            gcc -o main -ldl main.c

            運行:
            admin@admin-desktop:/abc/test$ ./main
            2008 2012
            2008與2012相比,2012為大數。


            很淺層的東西,這樣下次你直接修改你的testmax.c文件,編譯成動態庫拷貝到main目錄,不用編譯,直接可以加載你最新修改的testmax中的函數,前提是函數名、格式要相同

            posted on 2012-03-26 15:53 不會飛的鳥 閱讀(2904) 評論(1)  編輯 收藏 引用

            評論

            # re: Linux下動態加載動態庫,更新動態庫而不用更新程序 2012-03-26 15:58 不會飛的鳥

            補充一下,所使用的動態庫必須按照 extern "C"的方式定義,否則要出問題。

            生成動態鏈接庫是否必須使用 -fPIC 的問題
            http://hi.baidu.com/han_zhi_xing/blog/item/08f0ef37a50409360a55a9b4.html  回復  更多評論   

            日本精品一区二区久久久| 久久精品国产亚洲av麻豆小说| 伊人色综合久久| 亚洲精品99久久久久中文字幕 | 久久免费看黄a级毛片| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 久久久久人妻一区二区三区| 久久亚洲精精品中文字幕| 中文字幕久久欲求不满| 久久亚洲熟女cc98cm| 国产农村妇女毛片精品久久| 伊人久久大香线蕉综合Av | 久久久无码人妻精品无码| 久久国产热这里只有精品| 性做久久久久久久| 亚洲国产天堂久久综合| 亚洲综合久久综合激情久久| 久久精品aⅴ无码中文字字幕不卡| 伊人久久综在合线亚洲2019| 久久人人爽人人爽人人AV东京热| 久久人妻少妇嫩草AV蜜桃| 日本福利片国产午夜久久| 久久久久亚洲AV无码专区体验| 狠狠色丁香婷婷久久综合五月| 99久久精品国产综合一区| 久久精品国产亚洲麻豆| 69国产成人综合久久精品| 亚洲欧洲日产国码无码久久99 | 久久99精品久久久久久久久久| 久久精品日日躁夜夜躁欧美| 久久这里只精品99re66| 亚洲国产成人久久笫一页| 欧美色综合久久久久久| 精品久久综合1区2区3区激情| 99久久99久久精品国产片果冻| 伊人久久综在合线亚洲2019| 久久精品国产秦先生| 国产精品免费看久久久香蕉| 国内精品久久久久久久涩爱| 久久免费香蕉视频| 伊人久久大香线蕉亚洲五月天 |