• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 編寫共享庫的注意事項

    發表于:2007-05-25來源:作者:點擊數: 標簽:linux共享注意事項編寫
    linux 下的共享庫是一項讓人激動的技術,可以利用它充分提高系統的擴展能力,如插件式設計,個人認為它比 windows 的動態鏈接庫功能更強大。以下是我在 開發 共享庫經過一番折磨總結的需要注意的幾點,僅做自勉。 1、共享庫的對外接口函數的聲明必須加上 ext
    linux下的共享庫是一項讓人激動的技術,可以利用它充分提高系統的擴展能力,如插件式設計,個人認為它比windows的動態鏈接庫功能更強大。以下是我在開發共享庫經過一番折磨總結的需要注意的幾點,僅做自勉。

    1、共享庫的對外接口函數的聲明必須加上extern “C”。
    2、使用共享庫對話接口函數生成的對象指針時在該對象未被釋放之前不能關閉共享庫句柄,否則會出現segmentation fault錯誤。

    以下是一個插件式設計的示例

    主執行程序:main.cpp

    #include <iostream>
    #include <dlfcn.h>
    #include "SMSGamePlugin.h"

    int main(int argc, char** argv)
    {
    void *GameLib = dlopen("./Flower.so", RTLD_LAZY);
    const char *dlError = dlerror();
    if (dlError)
    {
    std::cout << "dlopen error!" << dlError << std::endl;
    return(-1);
    }
    CSMSGamePlugin *(*pGetGameObject)(void);
    pGetGameObject = (CSMSGamePlugin *(*)(void))dlsym(GameLib, "GetGameObject");
    dlError = dlerror();
    if (dlError)
    {
    std::cout << "dlsym error!" << dlError << std::endl;
    return(-1);
    }
    CSMSGamePlugin *pGame = (*pGetGameObject)();
    pGame->Initialize();
    pGame->Load();
    pGame->Handle();
    delete *pGame;
    dlclose(GameLib);
    }

    公用基類部分:SMSGamePlugin.h

    #ifndef __SMSGamePlugin_h__
    #define __SMSGamePlugin_h__

    class CSMSGamePlugin
    {
    public:
    virtual int Initialize(void) = 0;
    virtual int Load(void) = 0;
    virtual int Handle(void) = 0;
    };

    #endif

    編譯:g++ -rdynamic -ldl -s -o Test main.cpp

    共享庫部分:

    共享庫頭文件:Flower.h

    #ifndef __Flower_h__
    #define __Flower_h__

    #include "SMSGamePlugin.h"

    extern "C" CSMSGamePlugin *GetGameObject(void);

    class CFlower: public CSMSGamePlugin
    {
    public:
    virtual int Initialize(void);
    virtual int Load(void);
    virtual int Handle(void);
    };

    #endif

    共享庫實現文件:Flower.cpp

    #include <iostream>
    #include "Flower.h"

    CSMSGamePlugin *GetGameObject(void)
    {
    return(new CFlower());
    }

    int CFlower::Initialize(void)
    {
    std::cout << "Initialize()" << std::endl;
    return(0);
    }

    int CFlower::Load(void)
    {
    std::cout << "Load()" << std::endl;
    return(0);
    }

    int CFlower::Handle(void)
    {
    std::cout << "Handle()" << std::endl;
    return(0);
    }

    編譯g++ -c Flower.cpp
    g++ -shared -o Flower.so

    注意如果不加extern "C"編譯后運行時就會提示:
    dlsym error!./Test: undefined symbol: GetGameObject

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>