Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencipta dan Menggunakan Perpustakaan Dikongsi Dinamik (DSL) dalam C di Linux?

Bagaimanakah Saya Boleh Mencipta dan Menggunakan Perpustakaan Dikongsi Dinamik (DSL) dalam C di Linux?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 20:24:12472semak imbas

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

Mencipta dan Menggunakan Pustaka Dikongsi Dinamik dalam C pada Linux

Pustaka kongsi dinamik (DSL) membenarkan berbilang atur cara berkongsi kod, mengurangkan penggunaan memori dan meningkatkan kecekapan. Dalam C , DSL membolehkan penciptaan perpustakaan kelas boleh guna semula yang boleh diakses oleh berbilang boleh laku.

Mencipta DSL

Untuk mencipta DSL, tentukan antara muka kelas dan pelaksanaan dalam pengepala dan fail sumber (cth., myclass.h dan myclass.cc). Pastikan kelas termasuk pemusnah maya dan kaedah awam yang ditandakan di luar "C" untuk memudahkan pemuatan simbol.

Menggunakan DSL

Untuk menggunakan DSL dalam boleh laku yang berasingan, lakukan langkah berikut:

  1. Sertakan perpustakaan yang diperlukan () dan pengepala.
  2. Gunakan dlopen() untuk memuatkan perpustakaan kongsi.
  3. Akses fungsi dan simbol perpustakaan menggunakan dlsym().
  4. Panggil fungsi create_object() untuk membuat instantiate objek daripada perpustakaan kelas.
  5. Panggil kaedah objek.
  6. Hancurkan objek menggunakan destroy_object().

Contoh Kod

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);
}

Kompilasi dan Pelaksanaan

Pada Mac OS X:

  • Kompilasi DSL: g -dynamiclib -flat_namespace myclass.cc -o myclass.so
  • Kompilasi pengguna boleh laku: g class_user.cc -o class_user

Di Linux:

  • Kompilasi DSL: g -fPIC -shared myclass.cc -o myclass.so
  • Kompilkan pengguna boleh laku: g class_user.cc -ldl -o class_user

Laksanakan class_user untuk menggunakan pustaka kongsi MyClass. Ia akan membuat instantiate dan menggunakan objek MyClass dengan jayanya.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta dan Menggunakan Perpustakaan Dikongsi Dinamik (DSL) dalam C di Linux?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn