플러그인 시스템을 Boost.DLL로 쉽게 구현하는 소개

이 기사의 예상 사용자


  • C++ 의 기초적인 취급에는 문제없는 분
  • Boost를 사용할 수 있는 환경을 준비할 수 있는 사람
  • 네이티브 바이너리 플러그인 시스템에 관심이 있다면
  • 공유 라이브러리(.so 또는 .dll)의 OS별 네이티브 API를 직접 두드리거나 울타리가 강한 프레임워크에 의존한 구현을 하고 싶지 않은 분, 크로스 플랫폼 이식성에 관심이 있는 분
  • 독자적인 플러그인 시스템의 구현에 지친 분


  • 간단한 클래스 레벨 플러그인



    간단 · w ·

    준비하는 것


  • plugin_type.hxx : 이 절에서 소개하는 플러그인의 기본 소스입니다. 앱과 플러그인 각각에서 include하여 사용한다.
  • plugin_a.cxx : plugin_type을 기반으로 구현되는 특정 플러그인의 소스.
  • app.cxx : 플러그인을 사용하려는 앱의 소스.

  • plugin_type.hxx:
    #pragma once
    
    #include <string>
    
    namespace usagi::example::boost_dll
    {
      class plugin_type
      {
        public:
          virtual auto get_name() const -> std::string;
          virtual auto operator()( const int a, const int b ) const -> int;
          virtual ~plugin_type() { }
      };
    }
    

    plugin_a.cxx:
    #include "plugin_type.hxx"
    #include <boost/config.hpp>
    
    namespace usagi::example::boost_dll
    {
      class plugin_a : public plugin_type
      {
        public:
          auto get_name() const -> std::string override { return "adder"; }
          auto operator()( const int a, const int b ) const -> int override { return a + b; };
      };
    
      extern "C" BOOST_SYMBOL_EXPORT plugin_a plugin;
      plugin_a plugin;
    }
    

    app.cxx:
    #include "plugin_type.hxx"
    #include <boost/dll/import.hpp>
    #include <iostream>
    
    auto main() -> int
    {
      using namespace std;
      using namespace usagi::example::boost_dll;
      // ↓ op は boost::shared_ptr< plugin_type > 型で与えられる。
      // (std::shared_ptr へ変換したい場合は参考†を参照。)
      auto op =
        boost::dll::import< plugin_type >
        // ↓ロードするプラグインのパス(実用の際は一般に決め打ちにしない事が多い)
        ( boost::filesystem::path( "plugin_a" )
        // ↓インポートする対象のプラグインでエクスポートされているシンボル
        , "plugin"
        // ↓これを付けておくと、 .so や .dll をパスに勝手に追加してくれて便利
        , boost::dll::load_mode::append_decorations
        );
    
      cout << op->get_name() << " " << (*op)( 1, 2 ) << endl;
    }
    

    응용 프로그램: poker의 플레이어 AI를 플러그인화하고 놀 수 있도록 해 주는 예



    ↑라고 말하는 기사만 써도 별로 재미가 없기 때문에, ↓ 이런 것을 새해 전날 해커슨 2016 로 만들어 보았습니다. (할 수 있어, 이 기사를 쓰고 있는 현재, 이미 1월 4일이지만 네오(´ー`)노)

  • GitHub - usagi/poker : 작가가 자신의 워크숍이나 공부회용으로서 개발하는 플러그 가능한 포커 시스템입니다.



  • ↑이런 느낌으로 플레이어 AI의 플러그인을 조금 쓰면 ↓ 이런 상태로 즐길 수 있습니다.



    선전 : 「완쿠마 삿포로」 시작합니다 ヽ(´ー`)노



    2017년부터 완쿠마 동맹의 삿포로 지부로서, 완쿠마 공부회・삿포로를 연 2회의 페이스로 개최 할 수 있는 일이 되었습니다! 2017년은 3월 4일에 완쿠마 삿포로 #1, 8월 5일에 완쿠마 삿포로 #2를 개최합니다. 30분, 60분의 세션 프레임, LT 프레임, 간식 등 등 준비해 여러분의 참가&등단의 신청을 진심으로 기다리고 있습니다. 🍻🍶🍣

    나의 테두리가 발생한 완쿠마 삿포로회에서는, 이번 기사에서 소개한 poker 시스템을 베이스로 한 알고리즘 뇌즙 체조계의 워크숍을 실시할까라고 생각하고 있습니다. 그 때는 C++의 네이티브 구현 외에도 뭔가 조금 더 간편한 스크립트 언어의 바인딩 등에도 대응하고, C++ 입문이 아니라 알고리즘 뇌즙 체조로서 많은 참가자에게 즐길 수 있는 내용이 된다고 생각하고 있습니다 합니다. 그릇이나 어둠이 어떻게 됐는지 신경쓰지 않고, 꼭 「완쿠마 삿포로」에 놀러 오세요!

    덧붙여서, 올해부터 잠시에는, 이 poker 를 기능 확장하거나, 리팩토링 하거나, 그러한 때마다 C++ 의 구현 예 등 기술적인 부분의 입문자용의 기사 부분은 Qiita 에 투고할 생각이므로, 이쪽 계속해서 잘 부탁드립니다.

    참고



  • Chapter 10. Boost.DLL
  • Tutorial

  • boost::shared_ptr에서 std::shared_ptr로 변환하는 쉬운 방법
  • 좋은 웹페이지 즐겨찾기