GH-MD-TOCによって作成されました
Sobjectizerは、C ++のいくつかのクロスプラットフォームとOpenSource「Actor Frameworks」の1つです。しかし、Sobjectizerは俳優モデルだけでなく、モデルとCSPのようなチャネルを公開することもサポートしています。 Sobjectizerの目標は、C ++での同時およびマルチスレッドアプリケーションの開発を大幅に簡素化することです。
Sobjectizerを使用すると、非同期メッセージを介して相互作用するエージェントオブジェクトのセットとして同時アプリを作成できます。メッセージディスパッチを処理し、メッセージ処理のための作業コンテキストを提供します。そして、さまざまなすぐに使用できるディスパッチャーに提供することで、それらのものを調整できます。
成熟。 Sobjectizerは、1995年から2000年に提案されたアイデアに基づいています。 Sobjectizer自体は2002年から開発されています。Sobjectizer-5は2010年以来継続的に進化しています。
安定性。当初から、Sobjectizerはビジネス上の批判的なアプリケーションに使用されていましたが、それらのいくつかはまだ生産に使用されています。 Sobjectizerの変化を破ることはまれであり、私たちはそれらに非常に慎重にアプローチします。
クロスプラットフォーム。 Sobjectizerは、Windows、Linux、FreeBSD、MacOS、Androidで実行されます。
使いやすい。 Sobjectizerは、Sobjectizerの分布に多くの例と、プロジェクトのWikiに多くの情報があるため、理解しやすく使いやすいAPIを提供します。
無料。 SobjectizerはBSD-3-Clauseライセンスの下で配布されるため、独自の商用ソフトウェアの開発に無料で使用できます。
Sobjectizerは、Intelスレッディングビルディングブロック、TaskFlow、HPXなどのツールと同様のツールと比較されることがよくあります。このような比較は役に立たない。
これらすべてのツールは、並列コンピューティング領域からのタスクを解決するために使用することを目的としています。複数のCPUコアを利用することにより、計算時間を短縮できます。たとえば、1つのCPUコアで1時間以内にビデオファイルを1つのフォーマットから別の形式に再エンコードできます。4つのコアで15分しかかかりません。それが並列コンピューティングの主な目標です。
Sobjectizerは、わずかに異なる領域:同時コンピューティングを目的としています。 Sobjectizerの主な目標は、一度に多くの異なるタスクを実行することを簡素化することです。そのために1つのCPUコア以上を使用する必要がない場合があります。しかし、いくつかのCPUコアがある場合、Sobjectizerはこれらのタスクの処理とそれらの間の相互作用をはるかに簡単にします。
トリッキーな部分は、平行したコンピューティングと同時コンピューティングが、フードの下で同じ並行性メカニズムとプリミティブ(スレッド、ミューテックス、アトミックなど)を使用するという事実です。しかし、高レベルの視点からは、非常に異なるタスクに並行コンピューティングと同時コンピューティングが使用されます。
Sobjectizerの上に実装された、または実装できるアプリケーションの例として、マルチスレッドプロキシサーバー、自動制御システム、MQブローカー、データベースサーバーなどをリストできます。
これは、Sobjectizerのエージェントを使用して表現された古典的な例「Hello、World」です。
# include < so_5/all.hpp >
class hello_actor final : public so_5:: agent_t {
public:
using so_5:: agent_t :: agent_t ;
void so_evt_start () override {
std::cout << " Hello, World! " << std::endl;
// Finish work of example.
so_deregister_agent_coop_normally ();
}
};
int main () {
// Launch SObjectizer.
so_5::launch ([](so_5:: environment_t & env) {
// Add a hello_actor instance in a new cooperation.
env. register_agent_as_coop ( env. make_agent <hello_actor>() );
});
return 0 ;
}2つのエージェントとそれらの間のメッセージ交換を含む、より興味深い例を見てみましょう。これは、俳優のフレームワークのもう1つの有名な例である「Ping-Pong」:
# include < so_5/all.hpp >
struct ping {
int counter_;
};
struct pong {
int counter_;
};
class pinger final : public so_5:: agent_t {
so_5:: mbox_t ponger_;
void on_pong ( mhood_t <pong> cmd) {
if (cmd-> counter_ > 0 )
so_5::send<ping>(ponger_, cmd-> counter_ - 1 );
else
so_deregister_agent_coop_normally ();
}
public:
pinger ( context_t ctx) : so_5:: agent_t { std::move (ctx)} {}
void set_ponger ( const so_5:: mbox_t mbox) { ponger_ = mbox; }
void so_define_agent () override {
so_subscribe_self (). event ( &pinger::on_pong );
}
void so_evt_start () override {
so_5::send<ping>(ponger_, 1000 );
}
};
class ponger final : public so_5:: agent_t {
const so_5:: mbox_t pinger_;
int pings_received_{};
public:
ponger ( context_t ctx, so_5:: mbox_t pinger)
: so_5:: agent_t { std::move (ctx)}
, pinger_{ std::move (pinger)}
{}
void so_define_agent () override {
so_subscribe_self (). event (
[ this ]( mhood_t <ping> cmd) {
++pings_received_;
so_5::send<pong>(pinger_, cmd-> counter_ );
});
}
void so_evt_finish () override {
std::cout << " pings received: " << pings_received_ << std::endl;
}
};
int main () {
so_5::launch ([](so_5:: environment_t & env) {
env. introduce_coop ([](so_5:: coop_t & coop) {
auto pinger_actor = coop. make_agent <pinger>();
auto ponger_actor = coop. make_agent <ponger>(
pinger_actor-> so_direct_mbox ());
pinger_actor-> set_ponger (ponger_actor-> so_direct_mbox ());
});
});
return 0 ;
}上記のコードのすべてのエージェントは、同じ作業スレッドで動作しています。それらをさまざまな作業スレッドにバインドする方法は?
とても簡単です。適切なディスパッチャーを使用するだけです。
int main () {
so_5::launch ([](so_5:: environment_t & env) {
env. introduce_coop (
so_5::disp::active_obj::make_dispatcher (env). binder (),
[](so_5:: coop_t & coop) {
auto pinger_actor = coop. make_agent <pinger>();
auto ponger_actor = coop. make_agent <ponger>(
pinger_actor-> so_direct_mbox ());
pinger_actor-> set_ponger (ponger_actor-> so_direct_mbox ());
});
});
return 0 ;
}Sobjectizerは、マルチプロデューサー/マルチ消費者メッセージボックスを介してPub/Subモデルをサポートしています。そのメッセージボックスに送信されたメッセージは、そのメッセージタイプのすべてのサブスクライバーによって受信されます。
# include < so_5/all.hpp >
using namespace std ::literals ;
struct acquired_value {
std::chrono::steady_clock::time_point acquired_at_;
int value_;
};
class producer final : public so_5:: agent_t {
const so_5:: mbox_t board_;
so_5:: timer_id_t timer_;
int counter_{};
struct acquisition_time final : public so_5:: signal_t {};
void on_timer ( mhood_t <acquisition_time>) {
// Publish the next value for all consumers.
so_5::send<acquired_value>(
board_, std::chrono::steady_clock::now (), ++counter_);
}
public:
producer ( context_t ctx, so_5:: mbox_t board)
: so_5:: agent_t { std::move (ctx)}
, board_{ std::move (board)}
{}
void so_define_agent () override {
so_subscribe_self (). event (&producer::on_timer);
}
void so_evt_start () override {
// Agent will periodically recive acquisition_time signal
// without initial delay and with period of 750ms.
timer_ = so_5::send_periodic<acquisition_time>(* this , 0ms, 750ms);
}
};
class consumer final : public so_5:: agent_t {
const so_5:: mbox_t board_;
const std::string name_;
void on_value ( mhood_t <acquired_value> cmd) {
std::cout << name_ << " : " << cmd-> value_ << std::endl;
}
public:
consumer ( context_t ctx, so_5:: mbox_t board, std::string name)
: so_5:: agent_t { std::move (ctx)}
, board_{ std::move (board)}
, name_{ std::move (name)}
{}
void so_define_agent () override {
so_subscribe (board_). event (&consumer::on_value);
}
};
int main () {
so_5::launch ([](so_5:: environment_t & env) {
auto board = env. create_mbox ();
env. introduce_coop ([board](so_5:: coop_t & coop) {
coop. make_agent <producer>(board);
coop. make_agent <consumer>(board, " first " s);
coop. make_agent <consumer>(board, " second " s);
});
std::this_thread::sleep_for ( std::chrono::seconds ( 4 ));
env. stop ();
});
return 0 ;
}Sobjectizerのすべてのエージェントは有限状態のマシンです。階層的な有限状態マシン(HSM)のほとんどすべての機能がサポートされています:子の継承、on_enter/on_exitハンドラー、状態のタイムアウト、深い状態および浅い状態の歴史。
次のStateChartを実装するエージェントがどのように見えるかを見てみましょう。

これは、上記のステートチャートのエージェントを示す非常に簡単な例です。
# include < so_5/all.hpp >
using namespace std ::literals ;
class blinking_led final : public so_5:: agent_t {
state_t off{ this }, blinking{ this },
blink_on{ initial_substate_of{ blinking } },
blink_off{ substate_of{ blinking } };
public :
struct turn_on_off : public so_5 :: signal_t {};
blinking_led ( context_t ctx) : so_5:: agent_t { std::move (ctx)} {
this >>= off;
off. just_switch_to <turn_on_off>(blinking);
blinking. just_switch_to <turn_on_off>(off);
blink_on
. on_enter ([]{ std::cout << " ON " << std::endl; })
. on_exit ([]{ std::cout << " off " << std::endl; })
. time_limit (1250ms, blink_off);
blink_off
. time_limit (750ms, blink_on);
}
};
int main ()
{
so_5::launch ([](so_5:: environment_t & env) {
so_5:: mbox_t m;
env. introduce_coop ([&](so_5:: coop_t & coop) {
auto led = coop. make_agent < blinking_led >();
m = led-> so_direct_mbox ();
});
const auto pause = []( auto duration) {
std::this_thread::sleep_for (duration);
};
std::cout << " Turn blinking on for 10s " << std::endl;
so_5::send<blinking_led::turn_on_off>(m);
pause (10s);
std::cout << " Turn blinking off for 5s " << std::endl;
so_5::send<blinking_led::turn_on_off>(m);
pause (5s);
std::cout << " Turn blinking on for 5s " << std::endl;
so_5::send<blinking_led::turn_on_off>(m);
pause (5s);
std::cout << " Stopping... " << std::endl;
env. stop ();
} );
return 0 ;
}Sobjectizerでは、エージェントがなくても同時アプリケーションを作成できます。プレーンスレッドとCSPのようなチャネルのみを使用できます。
これは、Ping-Pongの例のプレーンスレッド実装です(Main()は例外安全ではないことに注意してください):
# include < so_5/all.hpp >
struct ping {
int counter_;
};
struct pong {
int counter_;
};
void pinger_proc (so_5:: mchain_t self_ch, so_5:: mchain_t ping_ch) {
so_5::send<ping>(ping_ch, 1000 );
// Read all message until channel will be closed.
so_5::receive ( so_5::from (self_ch). handle_all (),
[&](so_5:: mhood_t <pong> cmd) {
if (cmd-> counter_ > 0 )
so_5::send<ping>(ping_ch, cmd-> counter_ - 1 );
else {
// Channels have to be closed to break `receive` calls.
so_5::close_drop_content (so_5::exceptions_enabled, self_ch);
so_5::close_drop_content (so_5::exceptions_enabled, ping_ch);
}
});
}
void ponger_proc (so_5:: mchain_t self_ch, so_5:: mchain_t pong_ch) {
int pings_received{};
// Read all message until channel will be closed.
so_5::receive ( so_5::from (self_ch). handle_all (),
[&](so_5:: mhood_t <ping> cmd) {
++pings_received;
so_5::send<pong>(pong_ch, cmd-> counter_ );
});
std::cout << " pings received: " << pings_received << std::endl;
}
int main () {
so_5:: wrapped_env_t sobj;
auto pinger_ch = so_5::create_mchain (sobj);
auto ponger_ch = so_5::create_mchain (sobj);
std::thread pinger{pinger_proc, pinger_ch, ponger_ch};
std::thread ponger{ponger_proc, ponger_ch, pinger_ch};
ponger. join ();
pinger. join ();
return 0 ;
}Sobjectizerは、GolangのSelectステートメントに似たSelect()関数を提供します。この関数により、いくつかのメッセージチェーンからの受信メッセージを待つことができます。また、新しい発信メッセージを受け入れるためのメッセージチェーンの準備を待つこともできます。したがって、ターゲットメッセージチェーンがいっぱいになっている間に、着信メッセージの処理でブロッキングsend()non blocking send()send()select()を実行できます。
fibonacci計算の例があり、select()をバックプレッシャーメカニズムとして使用する例があります(数字読者のスレッドが以前の数字をまだ読み取らない場合は数字生産者スレッドが待機します)。また、この例のmain()関数は例外安全であることに注意してください。
# include < so_5/all.hpp >
# include < chrono >
using namespace std ;
using namespace std ::chrono_literals ;
using namespace so_5 ;
struct quit {};
void fibonacci ( mchain_t values_ch, mchain_t quit_ch )
{
int x = 0 , y = 1 ;
mchain_select_result_t r;
do
{
r = select (
from_all (). handle_n ( 1 ),
// Sends a new message of type 'int' with value 'x' inside
// when values_ch is ready for a new outgoing message.
send_case ( values_ch, message_holder_t < int >:: make (x),
[&x, &y] { // This block of code will be called after the send().
auto old_x = x;
x = y; y = old_x + y;
} ),
// Receive a 'quit' message from quit_ch if it is here.
receive_case ( quit_ch, [](quit){} ) );
}
// Continue the loop while we send something and receive nothing.
while ( r. was_sent () && !r. was_handled () );
}
int main ()
{
wrapped_env_t sobj;
thread fibonacci_thr;
auto thr_joiner = auto_join ( fibonacci_thr );
// The chain for Fibonacci number will have limited capacity.
auto values_ch = create_mchain ( sobj, 1s, 1 ,
mchain_props:: memory_usage_t ::preallocated,
mchain_props:: overflow_reaction_t ::abort_app );
auto quit_ch = create_mchain ( sobj );
auto ch_closer = auto_close_drop_content ( values_ch, quit_ch );
fibonacci_thr = thread{ fibonacci, values_ch, quit_ch };
// Read the first 10 numbers from values_ch.
receive ( from ( values_ch ). handle_n ( 10 ),
// And show every number to the standard output.
[]( int v ) { cout << v << endl; } );
send< quit >( quit_ch );
}Sobjectizerの詳細については、プロジェクトのWikiの対応するセクションにあります。
ASIOのベースのディスパッチャー、追加の種類のMBOX、取得可能なタイマー、同期要求など、多くのさまざまな便利なものが含まれる別のコンパニオンプロジェクトがあります。
たとえば、同期相互作用がどのように見えるかがあります( so_5::extra::syncを使用することで):
# include < so_5_extra/sync/pub.hpp >
# include < so_5/all.hpp >
// Short alias for convenience.
namespace sync_ns = so_5::extra::sync;
using namespace std ::chrono_literals ;
// The type of service provider.
class service_provider_t final : public so_5:: agent_t
{
public :
using so_5:: agent_t :: agent_t ;
void so_define_agent () override
{
so_subscribe_self (). event (
[]( sync_ns:: request_mhood_t < int , std::string> cmd ) {
// Transform the incoming value, convert the result
// to string and send the resulting string back.
cmd-> make_reply ( std::to_string (cmd-> request () * 2 ) );
} );
}
};
// The type of service consumer.
class consumer_t final : public so_5:: agent_t
{
// Message box of the service provider.
const so_5:: mbox_t m_service;
public :
consumer_t ( context_t ctx, so_5:: mbox_t service )
: so_5:: agent_t { std::move (ctx) }
, m_service{ std::move (service) }
{}
void so_evt_start () override
{
// Issue a request and wait for the result no more than 500ms.
auto result = sync_ns::request_reply< int , std::string>(
// The destination for the request.
m_service,
// Max waiting time.
500ms,
// Request's value.
4 );
std::cout << " The result: " << result << std::endl;
so_deregister_agent_coop_normally ();
}
};
int main ()
{
so_5::launch ( [](so_5:: environment_t & env) {
env. introduce_coop (
// Every agent should work on its own thread.
so_5::disp::active_obj::make_dispatcher ( env ). binder (),
[](so_5:: coop_t & coop) {
auto service_mbox = coop. make_agent < service_provider_t >()
-> so_direct_mbox ();
coop. make_agent < consumer_t >( service_mbox );
} );
} );
}Sobjectizer自体は、外部依存関係のない比較的小さなプロジェクトになることを目的としています。 So5Extraにはこの制約はありません。そのため、ASIOのベースのディスパッチャと環境インフラストラクチャがSo5Extraで、Sobjectizerではなく実装されています。
Sobjectizerのもう1つの重要な特性は安定性です。 Sobjectizerを可能な限り安定させようとしていますが、まだ成功し、要求しているかわからなくても、いくつかの新しい機能を試す必要があります。 So5Extraは新機能を試すのに適した場所であり、それらのいくつかは時間とともにSobjectizerに移動することができます。
したがって、Sobjectizerに役立つ機能が見つからない場合は、So5Extraを見てみましょう。多分それはすでにそこにあります。
Sobjectizerは、インプロセスのメッセージディスパッチフレームワークです。箱から出して分配されたアプリケーションをサポートしていません。ただし、その場合は外部ツールとライブラリを使用できます。 Mosquitto_transportの実験:https://github.com/stiffstream/mosquitto_transportをご覧ください
SobjectizerはGithubからチェックアウトできます。 Sobjectizerのソースコードを備えたアーカイブは、GithubまたはSourceForgeからダウンロードできます。
Sobjectizerを構築するには2つの方法があります。 MXX_RUツールを使用した最初のもの。 Cmakeを使用することによる2番目のもの。
注記。 V.5.5.15.2以来、Androidプラットフォームのサポートがあります。 Android用の建物は、Cmakeのみで可能です。以下のセクションを参照してください。
Sobjectizerは、 VCPKGおよびCONAN依存関係マネージャーを介してインストールおよび使用することもできます。以下の適切なセクションを参照してください。
Sobjectizerの5.8ブランチには、C ++ 17が必要です。
C ++ 14またはC ++ 11のサポートが必要な場合は、SourceForgeのSobjectizerの古いバージョンに注目してください。または、StiffStreamに連絡して、Sobjectizer-5.8の古いC ++標準への移植について話し合います。
注記。これは、Sobjectizerを構築するための標準的な方法です。この方法は、Sobjectizer開発プロセスで使用されます。
Sobjectizerを構築するには、Ruby言語とMXX_RUツールを使用する必要があります。 Rubyをインストールしてから、RubyGemsコマンドを介してMXX_RUをインストールします。
gem install Mxx_ru既にMXX_RUをインストールしている場合は、少なくともバージョン1.6.14.6に更新してください:
gem update Mxx_ruSobjectizerは、GithubのGitリポジトリから入手できます。
git clone https://github.com/stiffstream/sobjectizerSobjectizerを構築するには:
cd sobjectizer/dev
ruby build.rbSobjectizer用の静的および共有ライブラリが構築されます。ライブラリは、ターゲット/リリースサブディレクトリに配置されます。
共有ライブラリを構築したい場合:
cd sobjectizer/dev
ruby so_5/prj.rbまたは、静的ライブラリだけを構築する場合:
cd sobjectizer/dev
ruby so_5/prj_s.rbすべてのテストとサンプルを使用してSobjectizerを構築するには:
cd sobjectizer/dev
ruby build_all.rbFreeBSDでは、LD_LIBRARY_PATH環境変数を定義する必要がある場合があることに注意してください。 FreeBSDの下での実際のビルドコマンドシーケンスは次のとおりです。
cd sobjectizer/dev
export LD_LIBRARY_PATH=target/release
ruby build_all.rbSobjectizer用のHTML-Formatドキュメントを作成するには、Doxygenツールが必要です。インストールされている場合は:
cd sobjectizer/doxygen
doxygen生成されたHTML-Filesは、Sobjectizer/dev/doc/htmlに配置されます。
注記。自分でMXX_RU_CPP_TOOLSETを指定しない場合、MXX_RUはC ++ツールセットを自動的に検出しようとします。システムでデフォルトではないC ++コンパイラを使用する場合は、MXX_RU_CPP_TOOLSET環境変数を手動で定義してください。それは次のように見えるかもしれません:
export MXX_RU_CPP_TOOLSET= " clang_linux compiler_name=clang++-6 linker_name=clang++-6 "対応するドキュメントで見つけることができるニーズのMXX_RUの調整の詳細。
cmakeを介して鎮静剤を構築するには、cmakeとそれの使用方法についての知識を持つ必要があります。次のアクションは単なるデモンストレーションです。 Sobjectizer用のCmakeビルドシステムに関する詳細情報については、dev/cmake/cmakequickhohto.txtを参照してください
コマンドラインランでLinux/FreeBSDの下でSobjectizerを取得して構築するには:
git clone https://github.com/stiffstream/sobjectizer
cd sobjectizer
mkdir cmake_build
cd cmake_build
cmake -DCMAKE_INSTALL_PREFIX=target -DCMAKE_BUILD_TYPE=Release ../dev
cmake --build . --config Release
cmake --build . --config Release --target installこれらのコマンドは、必要なすべてのMakeFileを作成し、Sobjectizerを構築します。例やテストも作成する必要がある場合は、使用してください
cmake -DBUILD_ALL=ON -DCMAKE_INSTALL_PREFIX=target ../dev「Make 'install' finities './target'には2つのサブフォルダーが含まれます './bin'がサンプルを使用し、「./lib」が共有libso.5.xxsoを使用します。
Cmakeビルドシステムは現在、このオプションをサポートしています。
SOBJECTIZER_BUILD_STATIC 。 Sobjectizerの構築を静的ライブラリとして有効にする[デフォルト:オン]SOBJECTIZER_BUILD_SHARED 。共有ライブラリとしてSobjectizerの構築を有効にする[デフォルト:オン]BUILD_ALL 。構築の例とテストを有効にする[デフォルト:オフ]BUILD_EXAMPLES 。構築例を有効にする[デフォルト:オフ]BUILD_TESTS 。ビルディングテストを有効にする[デフォルト:オフ] BUILD_ALLまたはBUILD_EXAMPLESまたはBUILD_TESTSがオンになっている場合は、 SOBJECTIZER_BUILD_STATICとSOBJECTIZER_BUILD_SHARED両方をオンにする必要があることに注意してください。つまり、 SOBJECTIZER_BUILD_STATICまたはSOBJECTIZER_BUILD_SHAREDがオフになる場合、 BUILD_ALL / BUILD_EXAMPLES / BUILD_TESTSすべてオフにする必要があります。
コマンドラインからMS Visual Studio 2013によるWindowsの下でのSobjectizerを構築するには:
git clone https://github.com/stiffstream/sobjectizer
cd sobjectizer
mkdir cmake_build
cd cmake_build
cmake -DCMAKE_INSTALL_PREFIX=target -DCMAKE_BUILD_TYPE=Release -G " Visual Studio 15 2017 " ../dev
cmake --build . --config Release
cmake --build . --config Release --target install例を作成する必要がある場合は、cmakeの呼び出しでBUILD_ALLを使用します。
cmake -DCMAKE_INSTALL_PREFIX=target -DCMAKE_BUILD_TYPE=Release -DBUILD_ALL=ON -G " Visual Studio 15 2017 " ../dev V.5.5.24 SobjectizerはSobjectizer-Config.cmakeファイルを提供しているためです。これらのファイルは<target>/lib/cmake/sobjectizerサブフォルダーに自動的にインストールされます。 CmakeのFind_Packageコマンドを介してSobjectizerを使用できます。
Android用の建物は、かなり新鮮なAndroid NDKまたはCrystax NDKを介して可能です。
Android SDKとAndroid NDKがシステムにインストールされる必要があります。適切なバージョンのcmake。また、環境変数を適切に設定する必要がありますANDROID_HOME 、 ANDROID_NDK必要です。次に、次のコマンドを発行できます。
git clone https://github.com/stiffstream/sobjectizer
cd sobjectizer
mkdir cmake_build
cd cmake_build
cmake -DBUILD_ALL -DCMAKE_INSTALL_PREFIX=target -DCMAKE_BUILD_TYPE=Release
-DCMAKE_TOOLCHAIN_FILE= ${ANDROID_NDK} /build/cmake/android.toolchain.cmake
-G Ninja
-DANDROID_ABI=arm64-v8a
-DANDROID_NDK= ${ANDROID_NDK}
-DANDROID_NATIVE_API_LEVEL=23
-DANDROID_TOOLCHAIN=clang
../dev
cmake --build . --config=Release
cmake --build . --config=Release --target installCrystax NDK v.10.4.0以下がシステムにすでにインストールされている必要があります。 cmakeは、鎮静剤の構築に使用されます。
git clone https://github.com/stiffstream/sobjectizer
cd sobjectizer
mkdir cmake_build
cd cmake_build
export NDK=/path/to/the/crystax-ndk
cmake -DBUILD_ALL -DCMAKE_INSTALL_PREFIX=result -DCMAKE_TOOLCHAIN_FILE= $NDK /cmake/toolchain.cmake -DANDROID_ABI=arm64-v8a ../dev
make
make test
make installVCPKGを介してSobjectizerを使用するには、次の手順を実行する必要があります。
sobjectizerパッケージをインストールします。
vcpkg install sobjectizer次の行をcmakelists.txtファイルに追加します。
find_package (sobjectizer CONFIG REQUIRED)
target_link_libraries (your_target sobjectizer::SharedLib) # or sobjectizer::StaticLib注記。 2021年2月以降、Sobjectizerの新しいバージョンはConan-Centerのみを介して利用できます。
コナンを介してすねを使用するには、プロジェクトのconanfile.txtにsobjectizerを追加する必要があります。
[requires]
sobjectizer/5.8.0
また、Sobjectizerにsharedオプションを指定する必要がある場合があります。たとえば、静的ライブラリとしてのSobjectizerをビルドする場合:
[options]
sobjectizer:shared=False
プロジェクトの依存関係をインストールします。
conan install SOME_PATH --build=missing
...
include ( ${CMAKE_BINARY_DIR} /conanbuildinfo.cmake)
conan_basic_setup()
...
target_link_libraries (your_target ${CONAN_LIBS} )Sobjectizerは、3節BSDライセンスの下で配布されます。ライセンス情報については、ライセンスファイルを参照してください。