POCO C++库学习和分析 -- Foundation库SharedLibrary模块分析

本文介绍了POCO C++库的Foundation库中SharedLibrary模块,详细讲解了其功能,包括动态加载库、导出函数和导出类的使用。文章还分析了SharedLibrary的设计,强调了其支持多库加载、跨平台兼容以及类加载创建等特性,并探讨了内部实现的关键点,如自注册和垃圾收集。
摘要由CSDN通过智能技术生成

POCO C++库学习和分析 -- Foundation库SharedLibrary模块分析


        对于一个不熟悉的开源库和模块,我觉的最好的学习方法莫过于:

        1.  使用库,看库实现了什么功能和接口;

        2.  抛开库,想一想,自己如何实现。可以想出的出来是最好的,想不出其实也没什么关系,至少有了疑问。

        3.  看库的内层代码,学习和比较作者思路。

1.  SharedLibrary的功能和使用

        SharedLibrary的功能一句话可以概括,在运行时动态的加载库和库内的类。也就是说SharedLibrary提供了一个架构或者是约定,供库使用方和库提供方使用。只要满足了模块约定,就可以快速实现调用。

        对于库的调用来说,导出函数和导出类是基本的功能,windows和linux下具是如此,因此SharedLibrary也必须实现此功能。

1.1 导出函数

        先来看一个例子,说明导出函数是如何使用的。

        对于库提供方而言:

// TestLibrary.cpp
#include <iostream>
#if defined(_WIN32)
#define LIBRARY_API __declspec(dllexport)
#else
#define LIBRARY_API
#endif
extern "C" void LIBRARY_API hello();
void hello()
{
       std::cout << "Hello, world!" << std::endl;
}

        对于使用方而言:

// LibraryLoaderTest.cpp
#include "Poco/SharedLibrary.h"
using Poco::SharedLibrary;
typedef void (*HelloFunc)(); // function pointer type
int main(int argc, char** argv)
{
        std::string path("TestLibrary");
        path.append(SharedLibrary::suffix()); // adds ".dll" or ".so"
        SharedLibrary library(path); // will also load the library
        HelloFunc func = (HelloFunc) library.getSymbol("hello");
        func();
        library.unload();
        return 0;
}
        

        上述步骤,和调用普通的window dll和linux so文件步骤是如此的类似:第一步加载库文件,第二步获取库中API的函数地址,第三步运行函数。不同是所有的功能从操作系统提供的API变成了封装类SharedLibrary的类操作。

1.2  导出类

        再来看一个例子,说明SharedLibrary模块中类是如何导出并被使用的。
        对于库提供方:


.h文件

// AbstractPlugin.h
//
// This is used both by the class library and by the application.
#ifndef AbstractPlugin_INCLUDED
#define AbstractPlugin_INCLUDED
class AbstractPlugin
{
public:
		AbstractPlugin();
		virtual ~AbstractPlugin();
		virtual std::string name() const = 0;
};
#endif // AbstractPlugin.h<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值