GH-MD-TOC에 의해 만들어졌습니다
Sobjectizer는 C ++의 몇 가지 크로스 플랫폼 및 OpenSource "Actor Framework"중 하나입니다. 그러나 Sobjectizer는 액터 모델뿐만 아니라 서식 모델 및 CSP와 같은 채널을 게시합니다. Sobjectizer의 목표는 C ++에서 동시 및 다중 스레드 애플리케이션의 개발의 상당한 단순화입니다.
Sobjectizer는 동시 앱을 비동기 메시지를 통해 서로 상호 작용하는 에이전트 객체 세트로 생성 할 수 있습니다. 메시지 파견을 처리하고 메시지 처리를위한 작업 컨텍스트를 제공합니다. 다양한 즉시 사용 가능한 디스패처를 공급하여 이러한 것들을 조정할 수 있습니다.
성숙함 . Sobjectizer는 1995-2000 년에 제시된 아이디어를 기반으로합니다. Sobjectizer 자체는 2002 년부터 개발되고 있습니다. Sobjectizer-5는 2010 년부터 지속적으로 진화합니다.
안정성 . 처음부터 Sobjectizer는 비즈니스 크리티컬 애플리케이션에 사용되었으며 그 중 일부는 여전히 생산에 사용되고 있습니다. Sobjectizer의 변화를 깨는 것은 드물며 우리는 그들에게 매우 신중하게 접근합니다.
크로스 플랫폼 . Sobjectizer는 Windows, Linux, FreeBSD, MacOS 및 Android에서 실행됩니다.
사용하기 쉬운 . Sobjectizer는 이해하기 쉽고 사용하기 쉬운 API를 제공하며 Sobjectizer의 분배에 많은 예제와 프로젝트 위키에 많은 정보가 제공됩니다.
무료 . Sobjectizer는 BSD-3-Clause 라이센스에 따라 배포되므로 독점 상용 소프트웨어를 무료로 개발하는 데 사용할 수 있습니다.
Sobjectizer는 종종 인텔 스레딩 빌딩 블록, 작업 흐름, HPX 및 유사한 도구와 비교됩니다. 이러한 비교는 쓸모가 없습니다.
이러한 모든 도구는 병렬 컴퓨팅 영역에서 작업을 해결하는 데 사용됩니다. 여러 CPU 코어를 사용하여 계산 시간을 줄일 수 있습니다. 예를 들어, 하나의 CPU 코어에서 1 시간 이내에 비디오 파일을 한 형식에서 다른 형식으로 재창조 할 수 있습니다. 4 개의 코어에서는 15 분 밖에 걸리지 않습니다. 이것이 병렬 컴퓨팅의 주요 목표입니다.
Sobjectizer는 약간 다른 영역 인 동시 컴퓨팅을위한 것입니다. Sobjectizer의 주요 목표는 한 번에 많은 다른 작업을 수행하는 단순화입니다. 때로는 하나의 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 ;
}두 에이전트와 그들 사이의 메시지 교환으로 더 흥미로운 예를 살펴 보겠습니다. 배우 프레임 워크의 또 다른 유명한 예, "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를 구현하는 에이전트가 어떻게 보일 수 있는지 살펴 보겠습니다.

이것은 위에 표시된 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 () 함수를 제공합니다. 이 기능을 사용하면 여러 메시지 체인에서 들어오는 메시지를 기다릴 수 있습니다. 또한 새로운 발신 메시지를 수락하기 위해 메시지 체인의 준비를 기다릴 수 있습니다. 따라서 select ()는 대상 메시지 체인이 가득 차있는 동안 들어오는 메시지 처리로 비 블로킹 송신 () 호출을 수행 할 수 있습니다.
백 압력 메커니즘으로 select ()를 사용하는 Fibonacci 계산 예제가 있습니다 (Number Producer Thread가 Number Reader 스레드가 이전 번호를 아직 읽지 않으면 기다립니다). 이 예제에서 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에 대한 자세한 내용은 프로젝트 위키의 해당 섹션에서 확인할 수 있습니다.
ASIO의 기반 디스패처, 추가 유형의 Mbox, 취소 가능한 타이머, 동기 요청 등과 같은 다양한 유용한 것들이 포함 된 별도의 동반자 프로젝트 SO5Extra가 있습니다.
예를 들어, 동기 상호 작용이 어떻게 보이는지 ( so_5::extra::sync stuff를 사용하여) :
# 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의 기반 디스패처 및 환경 인프라가 Sobjectizer가 아닌 SO5Extra에서 구현되는 이유입니다.
Sobjectizer의 또 다른 중요한 특성은 안정성입니다. 우리는 Sobjectizer를 가능한 한 안정적으로 유지하려고 노력하고 있지만, 아직 성공하고 요구했던 것을 아직 모르더라도 새로운 기능을 시도해야합니다. So5extra는 새로운 기능을 실험하기에 좋은 장소이며, 일부는 시간이 지남에 따라 Sobjectizer로 옮길 수 있습니다.
따라서 Sobjectizer에서 유용한 기능을 찾지 못하면 So5extra를 살펴 보겠습니다. 어쩌면 이미 거기에있을 것입니다.
Sobjectizer는 프로세스 중 메시지 파견 프레임 워크입니다. 배포 된 응용 프로그램을 상자 밖에서 지원하지 않습니다. 그러나이 경우 외부 도구와 라이브러리를 사용할 수 있습니다. Mosquitto_Transport 실험 (https://github.com/stiffstream/mosquitto_transport)을 살펴보십시오
Sobjectizer는 Github에서 체크 아웃 할 수 있습니다. Sobjectizer의 소스 코드가있는 아카이브는 Github 또는 Sourceforge에서 다운로드 할 수 있습니다.
Sobjectizer를 구축하는 두 가지 방법이 있습니다. MXX_RU 도구를 사용하여 첫 번째. 두 번째는 cmake를 사용하여.
메모. V.5.5.15.2 이후 Android 플랫폼의 지원이 있습니다. Cmake는 Android를위한 건물이 가능합니다. 아래의 해당 섹션을 참조하십시오.
Sobjectizer는 VCPKG 및 Conan 의존성 관리자를 통해 설치 및 사용할 수도 있습니다. 아래의 해당 섹션을 참조하십시오.
Sobjectizer의 5.8 브랜치에는 C ++ 17이 필요합니다.
C ++ 14 또는 C ++ 11에 대한 지원이 필요한 경우 Sourceforge의 이전 버전의 Sobjectizer를 살펴보십시오. 또는 stiftstream에 연락하여 sobjectizer-5.8의 포팅에 대해 논의하십시오.
메모. 이것은 Sobjectizer를 구축하는 표준 방법입니다. 이 방법은 Sobjectizer 개발 프로세스에 사용됩니다.
Sobjectizer를 만들려면 Ruby Language 및 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- 형식 문서를 작성하려면 Doxygen 도구가 필요합니다. 설치된 경우 :
cd sobjectizer/doxygen
doxygen생성 된 HTML 파일은 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를 통해 Sobjectizer를 구축하려면 CMake와 사용 방법에 대한 지식이 필요합니다. 다음 조치는 단지 데모 일뿐입니다. Sobjectizer 용 Cmake 빌드 시스템에 대한 자세한 정보는 Dev/Cmake/CmakeQuickhowto.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'설치'완료 './target'은 샘플이 포함 된 두 개의 하위 폴더가 포함되어있다.
CMAKE 빌드 시스템은 현재 다음 옵션을 지원합니다.
SOBJECTIZER_BUILD_STATIC . 정적 라이브러리로서 Sobjectizer를 구축하는 활성화 [기본값 : on]SOBJECTIZER_BUILD_SHARED . 공유 라이브러리로서 Sobjectizer를 구축 할 수 있습니다 [기본값 : ON]BUILD_ALL . 구축 예제 및 테스트 활성화 [기본값 : OFF]BUILD_EXAMPLES . 빌드 예제 활성화 [기본값 : OFF]BUILD_TESTS . 건축 시험 활성화 [기본값 : OFF] 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 subfolder로 설치됩니다. 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 install시스템에 이미 설치된 Crystax NDK v.10.4.0 이상이 필요합니다. cmake는 Sobjectizer를 구축하는 데 사용됩니다.
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 sobjectizercmakelists.txt 파일에 다음 줄을 추가하십시오.
find_package (sobjectizer CONFIG REQUIRED)
target_link_libraries (your_target sobjectizer::SharedLib) # or sobjectizer::StaticLib메모. 2021 년 2 월부터 Conan-Center를 통해서만 새로운 버전의 Sobjectizer가 제공됩니다.
Conan을 통해 Sobjectizer를 사용하려면 프로젝트의 conanfile.txt 에 sobjectizer를 추가해야합니다.
[requires]
sobjectizer/5.8.0
Sobjectizer의 shared 옵션을 지정해야 할 수도 있습니다. 예를 들어, 정적 라이브러리로서 빌드 소비 젝트 :
[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는 BSD 라이센스 3 명으로 배포됩니다. 라이센스 정보는 라이센스 파일을 참조하십시오.