myclass.h
#ifndef __MYCLASS_H__#define __MYCLASS_H__class MyClass{public: MyClass(); virtual void DoSomething();private: int x;};#endifmyclass.cc
#include "myclass.h"#include <iostream>using namespace std;extern "C" MyClass* create_object(){ return new MyClass;}extern "C" void destroy_object( MyClass* object ){ delete object;}MyClass::MyClass(){ x = 20;}void MyClass::DoSomething(){ cout<<x<<endl;}class_user.cc
#include <dlfcn.h>#include <iostream>#include "myclass.h"using namespace std;int main(int argc, char **argv){ void* handle = dlopen("myclass.so", RTLD_LAZY); MyClass* (*create)(); void (*destroy)(MyClass*); create = (MyClass* (*)())dlsym(handle, "create_object"); destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object"); MyClass* myClass = (MyClass*)create(); myClass->DoSomething(); destroy( myClass );}在Mac OS X上,使用以下命令进行编译:
g++ -dynamiclib -flat_namespace myclass.cc -o myclass.sog++ class_user.cc -o class_user
在Linux上,使用以下命令进行编译:
g++ -fPIC -shared myclass.cc -o myclass.sog++ class_user.cc -ldl -o class_user
如果这是针对插件系统的,则可以将MyClass用作基类,并定义所有所需的虚拟函数。然后,插件作者将从MyClass派生,重写虚拟函数并实现
create_object和
destroy_object。您的主应用程序无需进行任何更改。



