有谁知道创建共享 C++ 类库的更完整的教程,该教程还展示了如何在单独的可执行文件中 使用这些类? 一个非常简单的教程,展示了对象的创建、使用(简单的 getter 和 setter 就可以了),以及删除会很棒。说明使用共享类库的一些开放源代码的链接或引用也同样好。
尽管codelogic和nimrodm的答案确实有效,但我只想补充一点,自从提出这个问题后,我拿起了一份《Beginning Linux Programming 》的副本,它的第一章有示例 C 代码以及创建和使用静态库和共享库的很好的解释. 这些示例可通过 Google 图书搜索在该书的旧版本中找到。
我的班级.h
#ifndef __MYCLASS_H__ #define __MYCLASS_H__ class MyClass { public: MyClass(); /* use virtual otherwise linker will try to perform static linkage */ virtual void DoSomething(); private: int x; }; #endif
我的班级.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) { /* on Linux, use "./myclass.so" */ 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.so g++ class_user.cc -o class_user
在 Linux 上,编译:
g++ -fPIC -shared myclass.cc -o myclass.so g++ class_user.cc -ldl -o class_user
如果这是针对插件系统的,您将使用 MyClass 作为基类并定义所有必需的虚拟函数。然后插件作者将从 MyClass 派生,覆盖虚拟对象并实现create_object和destroy_object. 您的主应用程序不需要以任何方式进行更改。
create_object
destroy_object