Integrating BehaviorTree.CPP Library for WebAssembly (Emscripten & CMake) Интеграция C++-библиотеки BehaviorTree.CPP для WebAssembly (Emscripten и CMake)

A step-by-step guide to configuring and integrating the BehaviorTree.CPP library in your CMake projects for WebAssembly using Emscripten. Пошаговое руководство по настройке и интеграции библиотеки BehaviorTree.CPP в проекты CMake для WebAssembly с использованием Emscripten.

Before proceeding, make sure you have built and installed the static libraries for WebAssembly using the appropriate guides: Перед продолжением убедитесь, что вы собрали и установили статические библиотеки для WebAssembly, следуя соответствующим инструкциям:

Step 1: Create Project Directory Шаг 1: Создание директории проекта

Create a workspace folder and a new directory for your BehaviorTree.CPP WebAssembly test project: Создайте рабочую папку для проектов и новую директорию для вашего тестового WebAssembly-проекта BehaviorTree.CPP:

Windows (Command Prompt / PowerShell)

mkdir C:\projects\bt-wasm-test
cd C:\projects\bt-wasm-test

Step 2: Create Source Files (main.cpp & CMakeLists.txt) Шаг 2: Создание исходных файлов (main.cpp и CMakeLists.txt)

Create the source files in your project directory using Notepad, VS Code, or Sublime Text: Создайте исходные файлы в папке проекта с помощью Блокнота, VS Code или Sublime Text:

Windows (Terminal / Notepad)

notepad main.cpp
notepad CMakeLists.txt

1. File Contents for main.cpp 1. Содержимое файла main.cpp

#include <iostream>
#include <behaviortree_cpp/bt_factory.h>
#include <emscripten.h>

// Custom action node
class SayHello : public BT::SyncActionNode {
public:
    SayHello(const std::string& name, const BT::NodeConfig& config)
        : BT::SyncActionNode(name, config) {}

    static BT::PortsList providedPorts() {
        return {};
    }

    BT::NodeStatus tick() override {
        std::cout << "Hello, BehaviorTree.CPP from WebAssembly!" << std::endl;
        return BT::NodeStatus::SUCCESS;
    }
};

BT::Tree tree;

void loop() {
    // Ticks the behavior tree in the browser/node event loop
    tree.tickOnce();
}

int main() {
    BT::BehaviorTreeFactory factory;
    factory.registerNodeType<SayHello>("SayHello");

    static const char* xml_text = R"(
     <root BTCPP_format="4">
         <BehaviorTree ID="MainTree">
             <SayHello/>
         </BehaviorTree>
     </root>
    )";

    tree = factory.createTreeFromText(xml_text);

    // Run the main loop once or at 1 FPS
    // 1 — simulate infinite loop (prevents exiting main)
    emscripten_set_main_loop(loop, 1, 1);

    return 0;
}

2. File Contents for CMakeLists.txt 2. Содержимое файла CMakeLists.txt

cmake_minimum_required(VERSION 3.21)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()

project(bt_wasm_test CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# -----------------------------------------------------------------------------
# Define Project Source Files
# -----------------------------------------------------------------------------
set(PROJECT_SOURCES
    main.cpp
)

# -----------------------------------------------------------------------------
# Declare Target Type
# -----------------------------------------------------------------------------
add_executable(app)

target_sources(app PRIVATE ${PROJECT_SOURCES})

# -----------------------------------------------------------------------------
# Library Paths for WebAssembly
# -----------------------------------------------------------------------------
set(BTCPP_PATH "C:/libs/behaviortree-4.9.0-wasm")
set(TINYXML2_PATH "C:/libs/tinyxml2-11.0.0-wasm")

# Core TinyXML2 Static Library
add_library(tinyxml2 STATIC IMPORTED)
set_target_properties(tinyxml2 PROPERTIES
    IMPORTED_LOCATION "${TINYXML2_PATH}/lib/libtinyxml2.a"
    INTERFACE_INCLUDE_DIRECTORIES "${TINYXML2_PATH}/include"
)

# BehaviorTree.CPP Static Library
add_library(behaviortree_cpp STATIC IMPORTED)
set_target_properties(behaviortree_cpp PROPERTIES
    IMPORTED_LOCATION "${BTCPP_PATH}/lib/libbehaviortree_cpp.a"
    INTERFACE_INCLUDE_DIRECTORIES "${BTCPP_PATH}/include"
    INTERFACE_LINK_LIBRARIES "tinyxml2"
)

target_link_libraries(app PRIVATE
    behaviortree_cpp
    tinyxml2
)

target_link_options(app PRIVATE
    "-sALLOW_MEMORY_GROWTH=1"
)

Step 3: Create Build & Execution Scripts Шаг 3: Создание скриптов сборки и запуска

Windows (Emscripten / Batch Scripts)

config-wasm.bat

call emcmake cmake -G "MinGW Makefiles" -S . -B dist/web

build-wasm.bat

call emmake cmake --build dist/web

run-wasm.bat

@echo off
node dist/web/app.js

Run the scripts sequentially in Command Prompt: Последовательно запустите скрипты в командной строке:

config-wasm.bat
build-wasm.bat
run-wasm.bat

Step 4: Expected Output Шаг 4: Ожидаемый результат

After running the build and execution scripts, you should see output in your terminal (or browser console if launched via a local server): После запуска скриптов сборки и выполнения вы увидите результат в терминале (или в консоли браузера при запуске через локальный сервер):

Hello, BehaviorTree.CPP from WebAssembly!

Support My Work Поддержать проект

If these tutorials helped you, consider buying me a coffee! Если эти туториалы вам помогли, вы можете поддержать автора.

Sberbank (Russia only) Сбербанк (только для РФ)

Sberbank SBP QR Code

Direct transfer via phone number (Russia only) Перевод по номеру телефона (только для РФ)

+7 (917) 212-29-59

USDT TRC20

USDT TRC20 QR Code

Support via Cryptocurrency Поддержка криптовалютой

TMtY1YifNf6FKvgeFmqKGQR4NStKr3csGp