2011-04-18 10 views
2

이 특정 질문을 검색했지만 결과가 나오지 않았습니다. 여기 또는 온라인 (일반적으로 나에게 맞는 문구가 조금 더 어려울 수 있기 때문일 수도 있음)이 아닙니다. 이미 요청한 경우 올바른 방향으로 나를 가리 키십시오.플러그인 지원을위한 라이브러리 준비

필자는 내 라이브러리/소프트웨어를 플러그 가능하게하고 싶습니다. 플러그인이 광범위하게 사용되는이 다양한 라이브러리와 시스템을 모두 볼 수 있으며 저자는 소프트웨어가 플러그인을 지원한다는 점을 자랑스럽게 지적합니다 (좋은 방법으로!).

내 질문은 어디에서 시작합니까? 얼음을 깰 수있는 책/온라인 자원이 있습니까? 도서관을 인도 할 수 있는지, 모범 사례를 정의하는지 등을 안내하지는 않습니까?

+0

이 사이트에서 정확한 태그, 즉 "[C++] [plugins]"를 검색하고 투표 수순으로 주문하십시오. 첫 번째 질문은 당신을 땅에서 떨어 뜨릴 것입니다. 투표를 닫으십시오. – Mat

+0

Dr. Dobbs에 몇 년 전에 나온 기사가있었습니다 ... http : //drdobbs.com/cpp/204202899? pgno = 1. 5 부분으로 된 기사이고 다른 부분에 대한 링크는 첫 번째 부분의 맨 위에 있습니다. – dgnorton

답변

1

당신은 시작하기 전에 몇 가지를 이해해야한다 : 표준 C++에서 (정적 또는 동적) 모듈에 대한 지원이 없습니다

  1. . 아니. 아직.
  2. Dll (또는 유닉스 계열 시스템의 .so)은 컴파일러/OS 의존적 인 동적으로로드 된 라이브러리입니다. 따라서 필요를 채울 수있는 실용적인 솔루션입니다.

그래서, 당신은 플러그인 바이너리로 (파일 확장자, 그것은이 주제에 대한 검색을위한 키워드의 무엇이든) 공유 라이브러리을 사용해야합니다. 플러그인에 그래픽 리소스와 같은 런타임 코드 이상이 포함되어야하는 경우 그래픽 리소스를 바이너리에 포함하거나 바이너리 파일이 포함 된 파일 형식 또는 압축 된 아카이브를 가질 수 있습니다.

플러그인 파일을 설치하는 방법에 관계없이 C++에서 문제는 인터페이스에 관한 것입니다. 사용하는 컴파일러에 따라 함수 또는 클래스를 내 보낸/가져온대로 "태그 지정"하는 여러 가지 방법이 있습니다. 즉, 플러그인 소스 코드가 코드를 내보내고 플러그인 사용자가 코드를 가져와야합니다.

(템플릿은 컴파일러 및 컴파일러 구성에 따라 다르기 때문에) 모듈을위한 C++의 명확하고 명확한 인터페이스를 설정합니다. 이러한 인터페이스는 함수 선언 및 인라인 코드가없고 유출/가져 오기 표시된 클래스 선언이어야합니다.

이제 일단이 기능이 있으면 OS 고유의 API를 사용하여 응용 프로그램이 실행되는 동안 동적 라이브러리 바이너리를로드/언로드 할 수 있습니다. 다 끝나면 OS 고유의 API를 사용하여 함수에 대한 포인터를 얻을 수 있습니다. 나는 너를 찾게했다.

이제 교차 플랫폼 방식으로이를 추상화하는 방법을 제공하는 라이브러리가 있습니다. 아직 사용하지 않았고 그들은 때문에 C++ 표준에서 정의의 부족 unperfect 것으로 알려져있다,하지만 당신은 응용 프로그램 크로스 플랫폼 가질 계획이라면 그들은 유용 할 수있다 :

  • boost::extension를 : 아직 라이브러리를 향상 시키거나 아직 제안하지 않았으며, 새로운 표준 C++ 구현이 완료 될 때까지 개발이 중단되었으므로 많은 사람들이 성공과 함께 사용한다고 말합니다.
  • POCO librarie에는 boost :: extension과 동일한 a library for shared libraries이 있습니다. 다시 한 번 많은 사람들이 유용하다고 말하면서 사용하기에 충분하다고 생각합니다.

타사 플랫폼을 지원할 필요가없는 경우 설치하기 쉽지만 다른 방법은 OS 관련 API에 대해 몇 가지 래퍼 코드를 작성하는 것입니다.그게 내가 boost :: extension에 대해 알기 전에 한 일이다.

관련 문제