Genyleap/Docs
Guide de la pile de développement · C++

Développement C++ moderne.

Un environnement orienté production, C++26-first, avec modules propres au projet, contrats d’erreur explicites, RAII, CMake par target, Ninja et toolchains natives. C++23 reste la voie de compatibilité si le compilateur ou la bibliothèque standard n’est pas prêt pour les fonctionnalités C++26 choisies.

Primary C++26 Compatibility C++23 Développer CMake 3.30+ · Ninja 1.11+ Targets Desktop · Mobile · Web

Référence d’ingénierie.

AreaDefaultRule
LanguageC++26Préférez le niveau de langage actuel ; utilisez C++23 uniquement lorsque la toolchain l’exige réellement.
Project boundariesC++ modulesNew project-owned production boundaries use .cppm modules by default.
Standard libraryMinimal headersUse normal standard headers in the global module fragment; do not depend on experimental import std;.
Erreursstd::expectedIntégrez les erreurs récupérables au contrat API au lieu de les cacher derrière des valeurs sentinelles.
Console outputstd::print / std::printlnPréférez la sortie formatée moderne aux nouvelles chaînes d’insertion iostream.
Build modelTarget-based CMakeGardez les compile features, sources, définitions et dépendances attachées à leurs targets propriétaires.
GeneratorNinjaUtilisez des arbres de build séparés par compilateur, configuration et target.

Commencez par les modules, pas par les headers.

Les frontières propres au projet doivent exprimer directement les responsabilités. Exportez les déclarations depuis les interfaces de module, gardez les implémentations non triviales dans les implementation units et isolez le code plateforme/tiers derrière des adaptateurs explicites.

C++ module interfacesrc/greeting/greeting.cppm
module;

#include <expected>
#include <string>
#include <string_view>

export module genyleap.greeting;

export namespace genyleap::greeting {

enum class GreetingError {
    EmptyName
};

[[nodiscard]] auto makeGreeting(std::string_view name)
    -> std::expected<std::string, GreetingError>;

}
C++ implementation unitsrc/greeting/greeting.cpp
module;

#include <expected>
#include <format>
#include <string>
#include <string_view>

module genyleap.greeting;

namespace genyleap::greeting {

auto makeGreeting(std::string_view name)
    -> std::expected<std::string, GreetingError>
{
    if (name.empty()) {
        return std::unexpected {GreetingError::EmptyName};
    }

    return std::format("Hello, {}.", name);
}

}
Composition rootsrc/main.cpp
#include <print>

import genyleap.greeting;

int main()
{
    const auto greeting = genyleap::greeting::makeGreeting("Genyleap");

    if (!greeting) {
        std::println("Unable to create greeting.");
        return 1;
    }

    std::println("{}", *greeting);
    return 0;
}

CMake basé sur les targets avec scan des modules.

Gardez le standard de langage, le file set de modules et le graphe de dépendances sur le target. N’utilisez pas de flags globaux ou d’include directories projet pour simuler une architecture classique à headers.

CMakeCMakeLists.txt
cmake_minimum_required(VERSION 3.30)

project(GenyleapHello
    VERSION 0.1.0
    LANGUAGES CXX
)

add_library(genyleap_greeting)

target_compile_features(genyleap_greeting
    PUBLIC
        cxx_std_26
)

target_sources(genyleap_greeting
    PUBLIC
        FILE_SET CXX_MODULES
        FILES
            src/greeting/greeting.cppm
    PRIVATE
        src/greeting/greeting.cpp
)

set_property(
    TARGET genyleap_greeting
    PROPERTY CXX_SCAN_FOR_MODULES ON
)

add_executable(genyleap_hello
    src/main.cpp
)

target_link_libraries(genyleap_hello
    PRIVATE
        genyleap_greeting
)

target_compile_features(genyleap_hello
    PRIVATE
        cxx_std_26
)
ShellConfigure · build · test
cmake -S . -B build/dev -G Ninja \
  -DCMAKE_BUILD_TYPE=Debug

cmake --build build/dev --parallel

ctest --test-dir build/dev \
  --output-on-failure \
  --no-tests=error

Toolchains de plateforme.

L’architecture C++ reste portable ; compiler, SDK, linker, packaging et runtime restent des frontières explicites. Ne réutilisez jamais un arbre CMake configuré après un changement de compilateur ou de SDK cible.

macOS.

Installez Xcode complet pour le SDK Apple et les outils plateforme. Apple Clang est le compilateur natif par défaut ; LLVM upstream peut coexister si des fonctionnalités ou diagnostics plus récents sont nécessaires.

ShellInstall and verify
sudo xcode-select --switch /Applications/Xcode.app
sudo xcodebuild -license accept

brew install cmake ninja llvm

xcrun clang++ --version
cmake --version
ninja --version
xcrun --show-sdk-path
Ne remplacez pas Apple Clang globalement.

Select upstream LLVM per build when needed; Apple SDK integration and upstream language experimentation are separate concerns.

Linux.

Gardez GCC et Clang disponibles lorsque la portabilité compte. Configurez un répertoire de build distinct par compilateur et vérifiez les modules avec la combinaison réelle CMake/compiler/generator plutôt que d’inférer depuis les seuls numéros de version.

ShellUbuntu / Debian baseline
sudo apt update
sudo apt install -y \
  build-essential \
  clang \
  lld \
  cmake \
  ninja-build \
  gdb
ShellSeparate compiler builds
cmake -S . -B build/gcc -G Ninja \
  -DCMAKE_CXX_COMPILER=g++

cmake -S . -B build/clang -G Ninja \
  -DCMAKE_CXX_COMPILER=clang++

Windows.

Use Visual Studio Build Tools with the C++ workload for the Windows SDK and MSVC ABI. Add LLVM when you want clang-cl diagnostics while retaining MSVC-compatible platform integration.

PowerShellInstall toolchains
winget install --id Microsoft.VisualStudio.2022.BuildTools `
  --override "--wait --passive --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"

winget install --id Kitware.CMake
winget install --id Ninja-build.Ninja
winget install --id LLVM.LLVM
Utilisez Developer PowerShell.

L’environnement MSVC compiler/linker/Windows SDK doit être initialisé avant de configurer CMake.

Android.

Use the Android NDK's Clang toolchain and CMake toolchain file rather than treating Android as a normal Linux desktop build. For projects that also use the current Qt baseline, the compatibility manifest currently resolves NDK r27c (27.2.12479018).

CMakeNative Android shape
cmake -S . -B build/android-arm64 -G Ninja \
  -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \
  -DANDROID_ABI=arm64-v8a \
  -DANDROID_PLATFORM=android-28

cmake --build build/android-arm64 --parallel

Gardez le code JNI, lifecycle, stockage et permissions spécifique à Android derrière des adaptateurs afin que les modules domain/application restent du C++ ordinaire.

iOS.

Use Xcode 16 or newer for the current Qt compatibility profile, and treat Apple frameworks, entitlements, signing and bundle resources as platform boundaries. Device and simulator builds are distinct targets even when they share application modules.

ShellInspect active Apple SDKs
xcodebuild -version
xcrun --sdk iphoneos --show-sdk-path
xcrun --sdk iphonesimulator --show-sdk-path
xcrun --sdk iphoneos clang++ --version

WebAssembly.

Use Emscripten when the target runtime is the browser. For the current Qt compatibility profile, Emscripten 5.0.5 is pinned automatically from upstream Qt documentation; a standalone C++/WASM project may intentionally choose a newer SDK after its own verification.

POSIX shellPin an emsdk toolchain
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk

./emsdk install 5.0.5./emsdk activate 5.0.5
source ./emsdk_env.sh
em++ --version
PowerShellWindows activation
git clone https://github.com/emscripten-core/emsdk.git
Set-Location emsdk

.\emsdk.bat install 5.0.5.\emsdk.bat activate 5.0.5
.\emsdk_env.ps1
em++ --version

Le threading navigateur, SIMD, l’accès filesystem et le réseau sont des contraintes runtime, pas de simples switches de compilation. Modélisez-les comme capacités de cible et vérifiez-les dans la configuration navigateur réellement livrée.

Les diagnostics font partie de l’environnement de développement.

La correction à la compilation n’est qu’une couche. Gardez des builds sanitizer et static analysis disponibles dès le départ plutôt que de les ajouter après une panne difficile à reproduire.

OutilUtilisationRecommendation
ASanMemory safety failuresDebug and CI where supported
UBSanUndefined behaviorPair with ASan in a dedicated diagnostic build
TSanData racesSeparate build because instrumentation changes runtime behavior
clang-tidyStatic analysis and modernizationEditor plus CI on changed production surfaces
CMakeTarget-local sanitizer example
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
    target_compile_options(genyleap_greeting PRIVATE
        -fsanitize=address,undefined
        -fno-omit-frame-pointer
    )

    target_link_options(genyleap_greeting PRIVATE
        -fsanitize=address,undefined
    )
endif()

Boost is part of the native foundation.

Use the C++ standard library first when it cleanly provides the required facility, then use Boost for capabilities that remain stronger or broader there. Keep Boost dependencies target-local, architecture-specific when compiled, and visible through modern CMake imported targets.

Applications utilisateur : adoptez Qt délibérément.

Pour une nouvelle application graphique de style Genyleap, la pile d’interface par défaut est Qt Quick, QML et Qt Quick Controls sur du code C++ application/domain modulaire. L’UI est un adaptateur ; elle ne possède pas de logique métier dupliquée.