한국어
C/C++
 

C++ C++로 플러그인 개발

makersweb 2019.12.08 17:42 조회 수 : 2741

플러그인은 메인 프로그램이 제어하는 프로그램의 일부가 될 수 있는 코드이다. C 또는 C++ 프로그램의 경우 일반적으로 플러그인은 기본프로그램에서 동적으로 로드(및 언로드)하는 공유 라이브러리로 구현된다.

 

플러그인 기반 소프트웨어 설계는 프로그램을 안전한 방식으로 확장하고 발전시킬 수 있다. 즉, 핵심 기능을 불안정하게 할 위험 없이 기능을 추가 할 수 있다. 또한 리스크 분리, 구현 세부 사항 숨기기, 격리 된 테스트 및 기타 여러 이점들을 얻을 수 있다.

 

플러그인 모델을 적용한 몇 가지 예로 크롬 웹 브라우저 웹스토어에 있는 수많은 확장 프로그램, 이미지 처리 응용 프로그램 (예: Adobe Photoshop) 용 확장 프로그램, 운영 체제 (예: Linux 모듈) 용 동적로드 가능한 디바이스 드라이버 등이 있다.

chrome Plugins.png

▲Chrome 웹 스토어

그러면 C++ 플러그인 시스템을 개발할 때 알아 두어야 하는 핵심 포인트 몇가지를 살펴보자.

  • 이진 호환성: C++ 표준은 ABI (Application Binary Interface)를 지정하지 않는다. 즉, 다른 컴파일러 또는 동일한 컴파일러의 다른 버전의 C++ 라이브러리는 호환되지 않을 수 있다. 그래도 고성능을 위한 시스템에 있어서는 C/C++만이 유일한 실용적인 선택이다.
  • 플러그인 라이프사이클 관리: 플러그인의 life-cycle을 관리하고 메인 시스템에 노출해야 한다.
  • 버전 관리: 개발된 플러그인의 API가 호환 가능한지를 확인 할 수 있는 방법이 필요하다.
  • 메타데이터: 버전을 비롯해 플러그인 이름등, 플러그인을 로드하기 전에 메타 정보를 취득할 수 있는 방법이 필요하다.
  • 링크 방법: 위에서도 언급했듯이 플러그인은 보통 동적 라이브러리로 만들고 런타임중에 로드, 언로드한다. 동적 라이브러리는 핫 스와핑 (시스템을 종료하지 않고 다시 로드), 안전한 확장 (핵심 시스템을 수정하지 않은 추가 기능) 및 링크 시간 단축과 같은 많은 장점을 제공한다. 그러나 일부 시스템(성능이 중요한 임베디드 시스템)이나 보안 문제로 인해 외부 코드를 로드 할 수 없는 경우가 있다. 때로는 플러그인이 기본 실행 파일에 정적으로 연결하는 것이 요구될 때도 있다.

C++ 플러그인 모델을 적용하기 위해 직접 구현 할 수도 있겠지만 이미 관련된 오픈 소스 라이브러리 또는 프레임워크를 사용 해보는 것도 시간을 아끼는 좋은 방법이 될 수 있겠다.

크로스플랫폼 응용프로그램 프레임워크인 Qt는 매우 유용한 플러그인 솔루션을 제공한다.libuv는 공유라이브러리를로드하고 라이브러리에서 심볼을 검색하기위한 크로스플랫폼용 API를 제공한다. 그 밖에도 역시 크로스 플랫폼을 지원하는 DynObj, Pluma등이 있다.

 

Linux 및 Windows에서 동작하는 C++ 예제: plugin_api.zip

번호 제목 글쓴이 날짜 조회 수
공지 C Programming FAQs(한글번역 pdf문서) makersweb 2014.03.18 27750
22 비트 필드의 크기는 해당 유형의 크기를 초과할 수 없다. makersweb 2023.04.25 1379
21 flexible array member 에 대해서 file makersweb 2020.02.20 2908
» C++로 플러그인 개발 file makersweb 2019.12.08 2741
19 배열과 포인터, 등가포인터 예제 makersweb 2019.01.16 2005
18 싱글톤 객체생성 패턴에 대해서 file makersweb 2018.07.01 4545
17 함수포인터와 typedef로의 선언 makersweb 2018.02.03 1993
16 예제소스를 통해 리틀엔디안(Little endian)과 빅엔디안(Big endian)의 차이점 알아보기 pjk 2014.05.24 8670
15 switch와 if 중 어느 것이 더 빠른가 file makersweb 2017.01.31 3805
14 구조체 배열을 반환하는 함수를 반환하는 함수를 호출하여 구조체 멤버 배열 요소 접근하기 makersweb 2016.05.22 10871
13 c/c++문자열, 유니코드 관련 함수 makersweb 2015.07.09 6230
12 volatile이 정확히 어떤 의미를 가지는 건가요? pjk 2014.09.30 5506
11 HEX(16진수) to ASCII(아스키) 변환 코드 pjk 2014.08.24 35064
10 strcmp, wcscmp, _tcscmp pjk 2014.07.18 11452
9 클래스 멤버에 대한 액세스 제어 pjk 2014.06.27 5540
8 unsigned형의 모든 상수에는 접미사 ‘U’를 사용하여야 한다. file pjk 2014.05.24 38830
7 void형 포인터 pjk 2014.05.24 6101
6 함수 포인터의 배열 pjk 2014.05.24 8664
5 구조체 메모리 저장방식 #pragma pack file pjk 2014.05.24 5957
4 Bit fields(비트필드) pjk 2014.05.24 4850
3 영어를 C언어로, 또는 C언어를 영어로 변환 해주는 cdecl makersweb 2014.03.19 8739