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

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

Mary-Kate Olsen
发布: 2024-12-05 20:24:12
原创
475 人浏览过

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

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

动态共享库 (DSL) 允许多个程序共享代码,减少内存使用并提高效率。在 C 中,DSL 允许创建可供多个可执行文件访问的可重用类库。

创建 DSL

要创建 DSL,请在标头中定义类接口和实现和源文件(例如 myclass.h 和 myclass.cc)。确保该类包含虚拟析构函数和标记为 extern“C”的公共方法,以方便符号加载。

使用 DSL

要在单独的可执行文件中使用 DSL,执行以下步骤:

  1. 包含必要的库 () 和
  2. 使用 dlopen() 加载共享库。
  3. 使用 dlsym() 访问库的​​函数和符号。
  4. 调用 create_object() 函数实例化一个从库类中调用对象。
  5. 调用对象的方法。
  6. 使用 destroy_object() 销毁对象。

示例代码

myclass.h

#include <iostream>

class MyClass {
public:
  MyClass();
  virtual void DoSomething();
private:
  int x;
};
登录后复制

myclass.cc

#include "myclass.h"

extern "C" MyClass* create_object() {
  return new MyClass;
}

extern "C" void destroy_object(MyClass* object) {
  delete object;
}

MyClass::MyClass() {
  x = 20;
}

void MyClass::DoSomething() {
  std::cout << x << std::endl;
}
登录后复制

class_user.cc

#include <dlfcn.h>
#include <iostream>
#include "myclass.h"

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 = create();
  myClass->DoSomething();
  destroy(myClass);
}
登录后复制

编译和执行

在 Mac OS X 上:

  • 编译 DSL: g -dynamiclib -flat_namespace myclass.cc -o myclass.so
  • 编译用户可执行文件:g class_user.cc -o class_user

在 Linux 上:

  • 编译 DSL:g -fPIC -shared myclass.cc -o myclass.so
  • 编译用户可执行文件:g class_user.cc -ldl -o class_user

执行class_user以使用MyClass共享库。它将成功实例化并利用 MyClass 对象。

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板