ホームページ >バックエンド開発 >C++ >Linux 上の C で動的共有ライブラリ (DSL) を作成して使用するにはどうすればよいですか?

Linux 上の C で動的共有ライブラリ (DSL) を作成して使用するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-04 00:25:12996ブラウズ

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

Linux 上の C での動的共有ライブラリの作成と利用

動的共有ライブラリ (DSL) は、C でのコードの再利用とモジュール化のための強力なメカニズムを提供します。これにより、複数のプログラムがライブラリ コードの 1 つのコピーを共有できるようになり、メモリ使用量が削減され、パフォーマンスが向上します。

動的共有ライブラリの作成

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 OS の場合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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。