>백엔드 개발 >C++ >Linux의 C에서 DSL(동적 공유 라이브러리)을 어떻게 만들고 사용할 수 있습니까?

Linux의 C에서 DSL(동적 공유 라이브러리)을 어떻게 만들고 사용할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-05 20:24:12468검색

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 -plat_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

MyClass 공유 라이브러리를 사용하려면 class_user를 실행하세요. MyClass 개체를 성공적으로 인스턴스화하고 활용합니다.

위 내용은 Linux의 C에서 DSL(동적 공유 라이브러리)을 어떻게 만들고 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.