利用继承关系,定义抽象类,只有纯虚函数构成的接口,然后具体的模块实现放在子类中。
通过extern "C" 解决C++名字修饰问题。得到子类指针。
然后所有函数的名字就遵循了统一约定。
涉及三个c相关的文件和一个makefile
main.cpp 为主程序负责调用so中的类的方法
Module.h 为模块通用接口
module1.cpp 为具体的某个模块的具体实现
Makefile描述编译
main.cpp
#include <iostream> #include <stdio.h> #include <stdlib.h> #include "Module.h" #include <dlfcn.h> 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
#include <iostream> class Module { public: virtual void run()=0; };
module1.cpp
#include <stdio.h> #include <stdlib.h> #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 so main:main.cpp so g++ $< -o $@ -O2 -rdynamic -ldl so:module1.cpp g++ $< -shared -Wl,-soname,libmodule1.so -o libmodule1.so -O2 -fPIC