문제

C++의 플러그인 시스템은 ABI가 적절하게 정의되지 않았고 각 컴파일러(또는 그 버전)가 자체 규칙을 따르기 때문에 어렵습니다.그러나 Windows의 COM은 다양한 컴파일러를 사용하는 프로그래머가 간단한 인터페이스를 사용하여 호스트 애플리케이션용 플러그인을 만들 수 있는 최소 플러그인 시스템을 만드는 것이 가능함을 보여줍니다.

실용적으로 생각해보자. 이 점에서 그다지 도움이 되지 않는 C++ 표준을 잠시 제쳐두자.C++ 플러그인을 지원하는 Windows 및 Mac(및 선택적으로 Linux)용 앱을 작성하고 플러그인 작성자에게 합리적으로 다양한 컴파일러 선택권을 제공하려는 경우(예: Visual C++의 2년 미만 버전) , GCC 또는 Intel의 C++ 컴파일러), C++의 어떤 기능을 기대할 수 있습니까?

물론, 플러그인은 특정 플랫폼용으로 작성될 것이라고 가정합니다.

내 머리 꼭대기에는 내가 생각할 수 있는 몇 가지 C++ 기능이 있으며, 그에 대한 답은 다음과 같습니다.

  • vtable 레이아웃, 추상 클래스를 통해 객체를 사용하려면?(예)
  • 내장 유형, 포인터?(예)
  • 구조체, 공용체?(예)
  • 예외?(아니요)
  • 외부 "C" 함수?(예)
  • 내장 매개변수 유형이 있는 비외부 "C" 함수를 stdcall로 호출하시겠습니까?(예)
  • 사용자 정의 매개변수 유형이 있는 비 stdcall 비 외부 "C" 함수?(아니요)

해당 분야에 대한 경험을 공유해 주시면 감사하겠습니다.C++ 플러그인 시스템을 갖춘 어느 정도 성공적인 앱을 알고 있다면 그것도 좋습니다.

도움이 되었습니까?

해결책

Dr Dobb의 저널에 기사가 있습니다. 나만의 플러그인 프레임워크 구축:1 부 그 주제에 대해 꽤 잘 읽었습니다.이는 C/C++ 크로스 플랫폼 플러그인 프레임워크의 아키텍처, 개발 및 배포를 다루는 일련의 기사의 시작입니다.

다른 팁

기존 플러그인 인터페이스를 스크립팅 인터페이스로 교체하는 것을 고려할 수도 있습니다.이미 문제를 해결한 C/C++의 여러 스크립팅 언어에 대한 매우 유용한 바인딩이 있습니다.그 위에 구축하는 것은 나쁜 생각이 아닐 수도 있습니다.예를 들어 다음을 살펴보세요. 부스트.파이썬.

Qt 제가 과거에 사용했던 플러그인에 대한 매우 훌륭한 시스템이 있습니다.이는 C++ 플러그인을 개발할 때 일반적으로 발견되는 많은 문제를 극복하기 위해 Qt의 메타 객체 시스템을 사용합니다.

한 가지 예는 다음과 같습니다. Q_DECLARE_INTERFACE 호환되지 않는 플러그인을 사용하는 것을 방지하기 위해 작동합니다.또 다른 것은 빌드 키, 아키텍처, OS, 컴파일러에 맞는 올바른 플러그인을 로드했는지 확인하세요.Qt의 플러그인 시스템을 사용하지 않는다면 이러한 문제에 대해 걱정하고 스스로 솔루션을 고안해야 합니다.반드시 로켓 과학일 필요는 없으며 실패할 것이라고 말하는 것은 아니지만 Trolltech의 직원은 꽤 똑똑하고 그것에 대해 한동안 생각했으며 바퀴를 직접 재발명하는 것보다 그들이 만든 것을 사용하고 싶습니다. .

또 다른 예는 다음과 같습니다 RTTI 일반적으로 DLL 경계에서는 작동하지 않지만 Qt를 사용할 때는 다음과 같습니다. qobject_cast 메타 객체 시스템에 의존하는 것은 DLL 경계를 넘어 작동합니다.

다음을 기반으로 플러그인 시스템을 만드는 것이 안전하다고 생각합니다.

  • 플러그인 기능을 라이브러리(.dll, .so 등)로 패키징
  • 플러그인이 주요 C 언어 내보내기를 노출하도록 요구합니다.
  • 플러그인이 추상 C++ 인터페이스를 구현하고 이에 대한 포인터/참조를 반환하도록 요구합니다.

아마도 가장 성공적인 C++ 플러그인 시스템일 것입니다.오래됐어 어도비 포토샵.그리고 그렇지 않다면 VSTi 등과 같은 가상 신디사이저 포맷 중 하나가 필요합니다.

그 책 불완전한 C++ - Matthew Wilson 이것에 대한 좋은 정보가 있습니다.

의 조언은 다음과 같습니다.동일한(또는 동등한) 컴파일러를 사용하는 한 C++를 사용할 수 있습니다. 그렇지 않으면 C++ 코드 위에 인터페이스로 C를 사용하는 것이 더 좋습니다.

에이스 크로스 플랫폼 플러그인 아키텍처를 가지고 있습니다.

확인해 보세요:

  1. 에이스 DLL
  2. ACE DLL 관리자

책을 확인해 보시는 걸 추천드려요
ACE 프로그래머 가이드

Firefox는 XPCOM에서 실행됩니다(http://www.mozilla.org/projects/xpcom/).Microsoft COM에서 영감을 얻었지만 다중 플랫폼입니다.

저는 C++ 플러그인 시스템을 갖춘 자체 게임 엔진을 가지고 있습니다.

헤더 파일에 일부 코드가 있어서 플러그인의 컴파일 단위에 삽입됩니다.

메인 엔진에 있는 더 큰 함수는 내보낸 C 함수를 통해 호출됩니다(플러그인은 엔진에서 obj->somefunction()을 호출하는 MyObject_somefunction(MyObject *obj)을 호출함).C 함수를 호출하는 것이 취향에 맞지 않는 경우 헤더 속임수를 사용하여 헤더가 플러그인에 포함될 때 C 함수를 호출하도록 #define 멤버 함수를 사용하세요.

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

가상 함수는 순수해야 하거나 코드가 헤더 파일에 있어야 합니다.클래스에서 상속하지 않고 단지 인스턴스화만 하는 경우 가상 함수 코드가 엔진에 있을 수 있지만 클래스는 플러그인에서 호출되는 개체를 생성하고 삭제하기 위해 일부 C 함수를 내보내야 합니다.

기본적으로 전체 플랫폼 독립성을 유지하려는 목표로 내가 사용한 트릭은 C 내보내기 및 헤더 파일 트릭에 불과합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top