Integrating IXWebSocket Client Library with CMake on Windows & Ubuntu Интеграция клиентской C++-библиотеки IXWebSocket с CMake под Windows и Ubuntu

A step-by-step guide to configuring and integrating the IXWebSocket client library in your CMake projects on Windows and Ubuntu. Пошаговое руководство по настройке и интеграции клиентской библиотеки IXWebSocket в проекты CMake под Windows и Ubuntu.

Before proceeding, make sure you have built and installed the IXWebSocket static library on your system using the appropriate guide: Перед продолжением убедитесь, что вы собрали и установили статическую библиотеку IXWebSocket в вашей системе, следуя соответствующей инструкции:

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

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

Windows (Command Prompt / PowerShell)

mkdir C:\projects\ixws-client-test
cd C:\projects\ixws-client-test

Ubuntu (Terminal)

mkdir -p ~/projects/ixws-client-test
cd ~/projects/ixws-client-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
Quick Nano Commands (Ubuntu):Быстрые команды Nano (Ubuntu): Paste code with Right Mouse Button (RMB) → Press Ctrl + O and Enter to save → Press Ctrl + X to exit. Вставьте код правой кнопкой мыши (ПКМ) → Нажмите Ctrl + O и Enter для сохранения → Нажмите Ctrl + X для выхода.

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

#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <ixwebsocket/IXNetSystem.h>
#include <ixwebsocket/IXWebSocket.h>

int main() {
    ix::initNetSystem();

    ix::WebSocket webSocket;
    std::string url("ws://127.0.0.1:3000");
    webSocket.setUrl(url);

    std::cout << "Connecting to " << url << "..." << std::endl;

    webSocket.setOnMessageCallback([&webSocket](const ix::WebSocketMessagePtr& msg) {
        if (msg->type == ix::WebSocketMessageType::Open) {
            std::cout << "Connection established!" << std::endl;
            webSocket.send("Hello from IXWebSocket Client!");
        } else if (msg->type == ix::WebSocketMessageType::Message) {
            std::cout << "Received message: " << msg->str << std::endl;
            webSocket.close();
        } else if (msg->type == ix::WebSocketMessageType::Close) {
            std::cout << "Connection closed. Code: " << msg->closeInfo.code 
                      << ", Reason: " << msg->closeInfo.reason << std::endl;
        } else if (msg->type == ix::WebSocketMessageType::Error) {
            std::cout << "Error: " << msg->errorInfo.reason << std::endl;
        }
    });

    webSocket.start();

    // Wait until connection closes or timeout occurs
    std::this_thread::sleep_for(std::chrono::seconds(5));

    webSocket.stop();
    ix::uninitNetSystem();
    return 0;
}

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

Imports all static library targets explicitly and configures platform-specific system dependencies: Явно импортирует все цели статических библиотек и настраивает системные зависимости под платформу:

set(CMAKE_BUILD_TYPE "Debug")

cmake_minimum_required(VERSION 3.21)
project(ixws_client_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(IXWEBSOCKET_DIR "C:/libs/ixwebsocket-12.0.1-mingw")
    set(MBEDTLS_DIR     "C:/libs/mbedtls-4.2.0-mingw")
    set(ZLIB_DIR        "C:/libs/zlib-1.3.2-mingw")

    target_include_directories(app PRIVATE
        ${IXWEBSOCKET_DIR}/include
        ${MBEDTLS_DIR}/include
        ${ZLIB_DIR}/include
    )

    add_library(IXWebSocket_Static STATIC IMPORTED)
    set_target_properties(IXWebSocket_Static PROPERTIES
        IMPORTED_LOCATION "${IXWEBSOCKET_DIR}/lib/libixwebsocket.a"
    )

    add_library(MBedTLS_Static STATIC IMPORTED)
    set_target_properties(MBedTLS_Static PROPERTIES
        IMPORTED_LOCATION "${MBEDTLS_DIR}/lib/libmbedtls.a"
    )

    add_library(MBedX509_Static STATIC IMPORTED)
    set_target_properties(MBedX509_Static PROPERTIES
        IMPORTED_LOCATION "${MBEDTLS_DIR}/lib/libmbedx509.a"
    )

    add_library(MBedCrypto_Static STATIC IMPORTED)
    set_target_properties(MBedCrypto_Static PROPERTIES
        IMPORTED_LOCATION "${MBEDTLS_DIR}/lib/libmbedcrypto.a"
    )

    add_library(ZLIB_Static STATIC IMPORTED)
    set_target_properties(ZLIB_Static PROPERTIES
        IMPORTED_LOCATION "${ZLIB_DIR}/lib/libzs.a"
    )

    target_link_libraries(app PRIVATE
        IXWebSocket_Static
        MBedTLS_Static
        MBedX509_Static
        MBedCrypto_Static
        ZLIB_Static
        ws2_32
        crypt32
        bcrypt
    )

    target_compile_options(app PRIVATE -Os)
    target_link_options(app PRIVATE -static -s -static-libgcc -static-libstdc++ -mconsole)

else() # Linux / Ubuntu
    set(IXWEBSOCKET_DIR "$ENV{HOME}/libs/ixwebsocket-12.0.1-ubuntu")
    set(MBEDTLS_DIR     "$ENV{HOME}/libs/mbedtls-4.2.0-ubuntu")
    set(ZLIB_DIR        "$ENV{HOME}/libs/zlib-1.3.2-ubuntu")

    target_include_directories(app PRIVATE
        ${IXWEBSOCKET_DIR}/include
        ${MBEDTLS_DIR}/include
        ${ZLIB_DIR}/include
    )

    add_library(IXWebSocket_Static STATIC IMPORTED)
    set_target_properties(IXWebSocket_Static PROPERTIES
        IMPORTED_LOCATION "${IXWEBSOCKET_DIR}/lib/libixwebsocket.a"
    )

    add_library(MBedTLS_Static STATIC IMPORTED)
    set_target_properties(MBedTLS_Static PROPERTIES
        IMPORTED_LOCATION "${MBEDTLS_DIR}/lib/libmbedtls.a"
    )

    add_library(MBedX509_Static STATIC IMPORTED)
    set_target_properties(MBedX509_Static PROPERTIES
        IMPORTED_LOCATION "${MBEDTLS_DIR}/lib/libmbedx509.a"
    )

    add_library(MBedCrypto_Static STATIC IMPORTED)
    set_target_properties(MBedCrypto_Static PROPERTIES
        IMPORTED_LOCATION "${MBEDTLS_DIR}/lib/libmbedcrypto.a"
    )

    add_library(ZLIB_Static STATIC IMPORTED)
    set_target_properties(ZLIB_Static PROPERTIES
        IMPORTED_LOCATION "${ZLIB_DIR}/lib/libz.a"
    )

    find_package(Threads REQUIRED)

    target_link_libraries(app PRIVATE
        IXWebSocket_Static
        MBedTLS_Static
        MBedX509_Static
        MBedCrypto_Static
        ZLIB_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: После запуска скриптов сборки и выполнения вы должны увидеть результат, похожий на следующий:

Connecting to ws://127.0.0.1:3000...
Connection established!
Received message: Hello from IXWebSocket Server!
Connection closed. Code: 1000, Reason: Normal closure

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