Integrating Box2D Static Library with CMake on Windows & Ubuntu Интеграция статической библиотеки Box2D с CMake под Windows и Ubuntu
A step-by-step guide to configuring and integrating the Box2D static library in your CMake projects on Windows and Ubuntu. Пошаговое руководство по настройке и интеграции статической библиотеки Box2D в проекты CMake под Windows и Ubuntu.
Step 1: Create Project Directory Шаг 1: Создание директории проекта
Create a workspace folder and a new directory for your Box2D test project: Создайте рабочую папку для проектов и новую директорию для вашего тестового проекта Box2D:
Windows (Command Prompt / PowerShell)
mkdir C:\projects\box2d-test
cd C:\projects\box2d-test
Ubuntu (Terminal)
mkdir -p ~/projects/box2d-test
cd ~/projects/box2d-test
Step 2: Create Source Files (main.cpp & CMakeLists.txt) Шаг 2: Создание исходных файлов (main.cpp и CMakeLists.txt)
You can create these files using Notepad / Sublime Text on Windows, or nano in Ubuntu terminal:
Вы можете создать эти файлы через Блокнот / Sublime Text в Windows или с помощью nano в терминале Ubuntu:
Windows (Terminal / Notepad)
notepad main.cpp
notepad CMakeLists.txt
Ubuntu (Terminal / Nano)
nano main.cpp
nano CMakeLists.txt
1. File Contents for main.cpp 1. Содержимое файла main.cpp
#include <box2d/box2d.h>
#include <iostream>
int main()
{
std::cout << "Initializing Box2D v3 physics world..." << std::endl;
// Create world definition and set gravity
b2WorldDef worldDef = b2DefaultWorldDef();
worldDef.gravity = (b2Vec2) { 0.0f, -9.8f };
// Create physics world
b2WorldId worldId = b2CreateWorld(&worldDef);
// Create ground static body
b2BodyDef groundBodyDef = b2DefaultBodyDef();
groundBodyDef.position = (b2Vec2) { 0.0f, -10.0f };
b2BodyId groundId = b2CreateBody(worldId, &groundBodyDef);
// Attach ground box shape
b2Polygon groundBox = b2MakeBox(50.0f, 10.0f);
b2ShapeDef groundShapeDef = b2DefaultShapeDef();
b2CreatePolygonShape(groundId, &groundShapeDef, &groundBox);
// Create dynamic body
b2BodyDef bodyDef = b2DefaultBodyDef();
bodyDef.type = b2_dynamicBody;
bodyDef.position = (b2Vec2) { 0.0f, 4.0f };
b2BodyId bodyId = b2CreateBody(worldId, &bodyDef);
// Attach dynamic box shape
b2Polygon dynamicBox = b2MakeBox(1.0f, 1.0f);
b2ShapeDef dynamicShapeDef = b2DefaultShapeDef();
dynamicShapeDef.density = 1.0f;
dynamicShapeDef.material.friction = 0.3f; // Or simply omit friction to use default shape settings
// If using Box2D v3.0+, surface properties are set on the shape definition:
b2CreatePolygonShape(bodyId, &dynamicShapeDef, &dynamicBox);
// Prepare simulation parameters
float timeStep = 1.0f / 60.0f;
int subStepCount = 4;
// Simulate 10 steps
for (int i = 0; i < 10; ++i)
{
b2World_Step(worldId, timeStep, subStepCount);
b2Vec2 position = b2Body_GetPosition(bodyId);
b2Rot rotation = b2Body_GetRotation(bodyId);
float angle = b2Rot_GetAngle(rotation);
std::cout << "Step " << i + 1 << " -> Position: (" << position.x << ", " << position.y << ") Angle: " << angle << std::endl;
}
// Clean up world
b2DestroyWorld(worldId);
std::cout << "Box2D simulation finished successfully!" << std::endl;
return 0;
}
2. File Contents for CMakeLists.txt 2. Содержимое файла CMakeLists.txt
Imports Box2D static library target explicitly and configures platform-specific paths: Явно импортирует цель статической библиотеки Box2D и настраивает пути под платформу:
set(CMAKE_BUILD_TYPE "Debug")
cmake_minimum_required(VERSION 3.21)
project(box2d_test CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(PROJECT_SOURCES
main.cpp
)
add_executable(app)
target_sources(app PRIVATE ${PROJECT_SOURCES})
if(WIN32)
set(BOX2D_DIR "C:/libs/box2d-3.1.1-mingw")
target_include_directories(app PRIVATE
${BOX2D_DIR}/include
)
add_library(Box2D_Static STATIC IMPORTED)
set_target_properties(Box2D_Static PROPERTIES
IMPORTED_LOCATION "${BOX2D_DIR}/lib/libbox2d.a"
)
target_link_libraries(app PRIVATE
Box2D_Static
)
# Strip symbols and optimize aggressive for size
target_compile_options(app PRIVATE -Os)
# MinGW static build settings
target_link_options(app PRIVATE -static -s -static-libgcc -static-libstdc++)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
target_link_options(app PRIVATE -mconsole)
else()
target_link_options(app PRIVATE -mwindows)
endif()
else() # Linux / Ubuntu
set(BOX2D_DIR "$ENV{HOME}/libs/box2d-3.1.1-ubuntu")
target_include_directories(app PRIVATE
${BOX2D_DIR}/include
)
add_library(Box2D_Static STATIC IMPORTED)
set_target_properties(Box2D_Static PROPERTIES
IMPORTED_LOCATION "${BOX2D_DIR}/lib/libbox2d.a"
)
find_package(Threads REQUIRED)
target_link_libraries(app PRIVATE
Box2D_Static
Threads::Threads
)
endif()
Step 3: Create Build & Execution Scripts Шаг 3: Создание скриптов сборки и запуска
Windows (MinGW / Batch Scripts)
config-exe.bat
cmake -G Ninja -S . -B dist/win
build-exe.bat
cmake --build dist/win
run-exe.bat
@echo off
.\dist\win\app.exe
Run the scripts sequentially in Command Prompt or PowerShell: Последовательно запустите скрипты в командной строке или PowerShell:
config-exe.bat
build-exe.bat
run-exe.bat
Ubuntu (Bash Scripts)
config-bin.sh
#!/usr/bin/env bash
set -e
cmake -G Ninja -S . -B dist/linux
build-bin.sh
#!/usr/bin/env bash
set -e
cmake --build dist/linux
run-bin.sh
#!/usr/bin/env bash
set -e
./dist/linux/app
Grant execute permissions on Ubuntu before running: Предоставьте права на выполнение в Ubuntu перед запуском:
chmod +x config-bin.sh build-bin.sh run-bin.sh
./config-bin.sh
./build-bin.sh
./run-bin.sh
Step 4: Expected Output Шаг 4: Ожидаемый результат
After running the build and execution scripts, you should see output similar to this: После запуска скриптов сборки и выполнения вы должны увидеть результат, похожий на следующий:
Initializing Box2D v3 physics world...
Step 1 -> Position: (0, 3.99728) Angle: 0
Step 2 -> Position: (0, 3.98911) Angle: 0
Step 3 -> Position: (0, 3.9755) Angle: 0
Step 4 -> Position: (0, 3.95644) Angle: 0
Step 5 -> Position: (0, 3.93194) Angle: 0
Step 6 -> Position: (0, 3.902) Angle: 0
Step 7 -> Position: (0, 3.86661) Angle: 0
Step 8 -> Position: (0, 3.82578) Angle: 0
Step 9 -> Position: (0, 3.7795) Angle: 0
Step 10 -> Position: (0, 3.72778) Angle: 0
Box2D simulation finished successfully!
Support My Work Поддержать проект
If these tutorials helped you, consider buying me a coffee! Если эти туториалы вам помогли, вы можете поддержать автора.
Sberbank (Russia only) Сбербанк (только для РФ)
Direct transfer via phone number (Russia only) Перевод по номеру телефона (только для РФ)
USDT TRC20
Support via Cryptocurrency Поддержка криптовалютой