小编典典

Linux 上的 C++ 动态共享库

all

有谁知道创建共享 C++ 类库的更完整的教程,该教程还展示了如何在单独的可执行文件中 使用这些类? 一个非常简单的教程,展示了对象的创建、使用(简单的
getter 和 setter 就可以了),以及删除会很棒。说明使用共享类库的一些开放源代码的链接或引用也同样好。


尽管codelogic和nimrodm的答案确实有效,但我只想补充一点,自从提出这个问题后,我拿起了一份《Beginning Linux
Programming

》的副本,它的第一章有示例 C 代码以及创建和使用静态库和共享库的很好的解释. 这些示例可通过 Google
图书搜索在该书的旧版本中找到。


阅读 66

收藏
2022-07-30

共1个答案

小编典典

我的班级.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_objectdestroy_object. 您的主应用程序不需要以任何方式进行更改。

2022-07-30