利用继承关系,定义抽象类,只有纯虚函数构成的接口,然后具体的模块实现放在子类中。
通过extern "C" 解决C++名字修饰问题。得到子类指针。
然后所有函数的名字就遵循了统一约定。
涉及三个c相关的文件和一个makefile
main.cpp 为主程序负责调用so中的类的方法
Module.h 为模块通用接口
module1.cpp 为具体的某个模块的具体实现
Makefile描述编译
main.cpp
#include#include #include #include "Module.h"#include using namespace std;int main(int argc,char *argv[]){ Module *mp; Module *mp1; void *dp; typedef Module* (*fun)(void); fun pp; dp=dlopen("/mnt/c/Users/reed/Desktop/cppdll/libmodule1.so",RTLD_LAZY); if (dp==NULL) { fprintf(stderr,"Error: so load error\n"); fprintf(stderr," %s\n",dlerror()); exit(0); } pp=(fun)dlsym(dp,"generate"); if (pp==NULL) { fprintf(stderr,"Error: symbol error\n"); fprintf(stderr," %s\n",dlerror()); exit(0); } mp=pp(); mp1=pp(); mp->run(); mp1->run();}
Module.h
#includeclass Module{public: virtual void run()=0;};
module1.cpp
#include#include #include "Module.h"class module1: public Module{public: void run() { printf("I am module1\n"); }};extern "C" { Module *generate() { return new module1(); }};
Makefile
all:main somain:main.cpp so g++ $< -o $@ -O2 -rdynamic -ldlso:module1.cpp g++ $< -shared -Wl,-soname,libmodule1.so -o libmodule1.so -O2 -fPIC