linux下开发共享库的注意事项

本文介绍了在Linux环境下开发共享库时应注意的关键事项,包括对外接口函数的声明方式、对象指针使用规范及示例代码。通过遵循这些指导原则,开发者能够有效避免运行时错误并提升程序稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux下开发共享库的注意事项

linux下的共享库是一项让人激动的技术,可以利用它充分提高系统的扩展能力,如插件式设计,个人认为它比windows的动态链接库功能更强大。以下是我在开发共享库经过一番折磨总结的需要注意的几点,仅做自勉。

  1. 共享库的对外接口函数的声明必须加上extern “C”
  2. 使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。

以下是一个插件式设计的示例

主执行程序:main.cpp
#include
#include
#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
#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值