用C++面向对象的方式动态加载so
作者在搭建一个通用的server时遇到了一个典型问题:整个服务框架大同小异,唯一的变量是数据源获取方式。为了避免代码冗余,他探索了用C++面向对象的方式来动态加载.so文件。 核心方案的关键在于封装与多态。作者并没有停留在简单的`dlopen`调用上,而是设计了一套清晰的接口体系:首先定义一个抽象的基类(例如`DataFetcher`),其中包含获取数据的纯虚函数。然后,为每一种特定的数据源编写继承自该基类的具体实现类,并将这些实现分别编译成独立的.so动态库。 在主程序(server)中,仅通过基类的指针与这些插件交互。程序启动或需要切换数据源时,再根据配置或标识符,动态地`dlopen`对应的.so,并使用`dlsym`获取其中创建实例的工厂函数。通过工厂函数,主程序便能拿到一个具体派生类对象的基类指针,从而实现对不同数据源的无缝调用与切换。 这种方法巧妙地将变化的部分(具体的数据源逻辑)与稳定的框架解耦。当需要支持新的数据源时,开发者只需按照约定的接口实现新的派生类并编译成.so,而无需修改或重新编译server主程序,极大地提升了系统的可扩展性和维护性。这篇分享为处理类似“同一框架,不同实现”的工程问题提供了一个清晰、可复用的C++解决方案。