首页 >后端开发 >C++ >如何在 Linux 上用 C 创建和使用动态共享库 (DSL)?

如何在 Linux 上用 C 创建和使用动态共享库 (DSL)?

Patricia Arquette
Patricia Arquette原创
2024-12-04 00:25:12932浏览

How Do I Create and Use Dynamic Shared Libraries (DSLs) in C   on Linux?

在 Linux 上用 C 创建和使用动态共享库

动态共享库 (DSL) 为 C 中的代码重用和模块化提供了强大的机制。它们允许多个程序共享库代码的单个副本,从而减少内存使用并提高性能。

创建动态共享库

要创建 DSL,您需要定义类和函数分别位于头文件和实现文件中。在头文件中,使用虚函数声明您的类以防止静态链接。在实现文件中,定义函数并提供用于创建和销毁对象的包装函数。

// myclass.h
class MyClass {
public:
  virtual void DoSomething();

private:
  int x;
};

// myclass.cc
extern "C" MyClass* create_object() { return new MyClass; }
extern "C" void destroy_object(MyClass* object) { delete object; }

编译和链接

在 Linux 上:

g++ -fPIC -shared myclass.cc -o myclass.so

在 Mac 操作系统上X:

g++ -dynamiclib -flat_namespace myclass.cc -o myclass.so

使用共享库

在单独的可执行文件中,使用 dlopen() 加载 DSL 并检索指向 create_object() 和 destroy_object() 函数的指针。使用create_object()创建一个类实例,使用类方法,最后调用destroy_object()来释放内存。

// class_user.cc
int main() {
  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);
}

编译和链接:

开启Linux:

g++ class_user.cc -ldl -o class_user

在 Mac OS X 上:

g++ class_user.cc -o class_user

示例代码

提供的示例展示了如何创建共享类库,将其加载到单独的可执行文件中,并利用类功能。主要概念涉及定义类和函数、创建用于对象创建和销毁的包装函数、加载库以及调用类方法。

以上是如何在 Linux 上用 C 创建和使用动态共享库 (DSL)?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn