Verwenden von CMake mit C++Builder

Aus RAD Studio
Wechseln zu: Navigation, Suche

Überblick

CMake ist der De-Facto-Standard zum Erstellen und Verwalten von C++-Bibliotheken von Fremdherstellern und aufgrund seiner Flexibilität und plattformübergreifenden Funktionen weit verbreitet.

Die Integration der CMake-Unterstützung in die neue Toolkette für "Windows 64 Bit Modern C++" ermöglicht es Ihnen, C++-Bibliotheken von Fremdherstellern ganz einfach zu erzeugen, und insbesondere von den Vorteilen der Kompatibilität der neuen Toolkette mit modernen C++-Bibliotheken zu profitieren. Außerdem können Sie auch eigene Anwendungen mit CMake erzeugen.

Bibliotheken von Fremdherstellern erzeugen

Um Bibliotheken von Fremdherstellern mit CMake zu erzeugen, führen Sie das Programm über die RAD Studio-Eingabeaufforderung (64 Bit) aus und stellen Sie sicher, dass der Ordner "bin64" des Produkts im Pfad und "cmake" in der Umgebungsvariable PATH enthalten ist. Stellen Sie abschließend sicher, dass Ninja installiert ist und im PATH enthalten ist.

  • CMake ist über den GetIt-Package-Manager erhältlich. Verwenden Sie diese Version, die zur Unterstützung der C++Builder-Toolkette geändert wurde.
  • Ninja ist unter https://ninja-build.org/ erhältlich. Es handelt sich um eine eigenständige, weitergabefähige EXE-Datei. Sie kann beliebig im PATH-Pfad platziert werden.

Verwenden Sie die folgenden CMake-Optionen, wenn Sie einen Build mit einer vorhandenen CMakeList.txt-Datei erzeugen:

-DCMAKE_SYSTEM_NAME=Windows

-DCMAKE_SYSTEM_PROCESSOR=x86_64

-DCMAKE_CROSSCOMPILING=OFF

-DCMAKE_BUILD_TYPE=Release

-DCMAKE_INSTALL_PREFIX=<install dir>

-DCMAKE_ASM_COMPILER=bcc64x

-DCMAKE_C_COMPILER=bcc64x

-DCMAKE_CXX_COMPILER=bcc64x

Die meisten davon sind selbsterklärend: Windows, 64 Bit Intel, keine plattformübergreifende Compilierung (d. h. Ziel ist Win64), ein Release-Build und den neuen Compiler, bcc64x, verwenden. Die endgültigen Build-Artefakte werden nach dem Erzeugen in einen CMake-Installationsordner (EN) platziert, um sie von den Zwischen-Build-Dateien zu trennen.

Verwenden Sie dann die folgenden Befehle:

cmake -G Ninja -S <nowiki><source dir> -B <build dir> -Wno-dev <cmake options>

cmake --build <build dir> --config Release

cmake --install <build dir> --config Release

C++Builder-Projekte erzeugen

CMake hat sich im Laufe der Jahre erheblich weiterentwickelt und das moderne CMake dreht sich nun um das Konzept der "Ziele". Diese Ziele kapseln Compilierungsregeln, Abhängigkeiten und Eigenschaften und bieten so einen bereinigten und modularen Ansatz zum Verwalten von Compilierungen.

Die neue Implementierung in C++Builder übernimmt dieses moderne CMake-Paradigma vollständig. RAD Studio integriert die Unterstützung für die Verwaltung von Zielen in C++Builder direkt aus dem Ziel heraus, sodass Entwickler die leistungsstarken Funktionen von CMake voll ausschöpfen können. Durch diese Modernisierung wird C++Builder an aktuelle Industriestandards angepasst, wodurch Entwickler komplexe Build-Konfigurationen einfacher verwalten und in Bibliotheken von Fremdherstellern integrieren können.

Einschränkungen

  • C++Builder-Projekte sind nur mit dem Ninja-Generator kompatibel.
  • Benutzerdefinierte C++Builder-Komponenten sind in Delphi-Projekten nicht verfügbar. Da C++Builder-Komponentenprojekte keine .DCP- oder .DCU-Dateien generieren, werden die benutzerdefinierten, mit C++Builder erstellten (.BPL)-Steuerelementdateien nicht in der Tool-Palette für Delphi-Projekte angezeigt.
  • CMake kann keine *.res-Ressourcendateien generieren, da es von verschiedenen internen Projekteinstellungen abhängig ist, wie z. B. dem Symbol, Produktinformationen und anderen Einstellungen. Außerdem kann die IDE Tools wie "Einzelnes Symbol" während der Compilierung verwenden. Deshalb müssen Sie das Projekt mindestens einmal mit der IDE erzeugen und die im Ausgabeordner erstellten .res-Dateien verwenden. Das Gleiche gilt für *.tbd-Dateien für ActiveX-Projekte.

Packages

Packages sollten wie Bibliotheken behandelt werden, weil die neue Win64x-Toolkette sowie CMake intern die Option -l<Name> für Bibliotheken verwenden. Diese Option kann auch auf Packages angewendet werden. Wenn beispielsweise sowohl Package1.lib (statisch) als auch Package1.bpi (dynamisch) vorhanden sind, übergeben Sie den Bibliotheksnamen "Package1".

C++Builder-Ziel einrichten

Bei der früheren Implementierung von CMake wurde ein Makro namens "set_embt_target" verwendet. In der neuen Implementierung wird eine Funktion mit demselben Namen verwendet. Das erste Argument ist jetzt jedoch das Projektziel, wodurch mehrere Ziele im selben Projekt zulässig sind.

Hier ist die Deklaration der neuen Funktion:

set_embt_target(<target> [RTL | VCL | FMX | Package | DynamicRuntime | Unicode])

Beispiele

Dies ist eine VCL-Anwendung (statisches Linken):

cmake_minimum_required(VERSION 3.30)

project(MyProject)

file(GLOB SOURCES "${CMAKE_SOURCE_DIR}/*.cpp")

add_executable(Project1 WIN32 ${SOURCES})

set_embt_target(Project1 VCL)

target_include_directories(Project1 PRIVATE "${CMAKE_SOURCE_DIR}")

target_link_libraries(Project1 PRIVATE "${CMAKE_SOURCE_DIR}/Project1.res")

install(TARGETS Project1

       RUNTIME DESTINATION bin

       ARCHIVE DESTINATION lib

       LIBRARY DESTINATION lib

)

Dies ist ein FMX-Anwendungsbeispiel (dynamisches Linken):

cmake_minimum_required(VERSION 3.30)

project(MyProject)

file(GLOB SOURCES "${CMAKE_SOURCE_DIR}/*.cpp")

add_executable(Project1 WIN32 ${SOURCES})

set_embt_target(Project1 FMX DynamicRuntime)

target_include_directories(Project1 PRIVATE "${CMAKE_SOURCE_DIR}")

target_link_libraries(Project1 PRIVATE "${CMAKE_SOURCE_DIR}/Project1.res")

install(TARGETS Project1

       RUNTIME DESTINATION bin

       ARCHIVE DESTINATION lib

       LIBRARY DESTINATION lib

)

Das folgende Beispiel zeigt eine Konsolen-Anwendung unter Verwendung der RTL (statisches Linken):

cmake_minimum_required(VERSION 3.30)

project(MyProject)

file(GLOB SOURCES "${CMAKE_SOURCE_DIR}/*.cpp")

add_executable(Project1 ${SOURCES})

set_embt_target(Project1 RTL)

target_include_directories(Project1 PRIVATE "${CMAKE_SOURCE_DIR}")

target_link_libraries(Project1 PRIVATE "${CMAKE_SOURCE_DIR}/Project1.res")

install(TARGETS Project1

       RUNTIME DESTINATION bin

       ARCHIVE DESTINATION lib

       LIBRARY DESTINATION lib

)

Das folgende Beispiel ist für ein VCL-Package:

cmake_minimum_required(VERSION 3.30)

project(MyProject)

file(GLOB SOURCES "${CMAKE_SOURCE_DIR}/*.cpp")

add_library(Package1 SHARED ${SOURCES})

add_library(Package1_static STATIC ${SOURCES})

set_target_properties(Package1_static PROPERTIES OUTPUT_NAME "Package1")

set_embt_target(Package1 VCL Package)

set_embt_target(Package1_static VCL Package)

target_include_directories(Package1 PRIVATE "${CMAKE_SOURCE_DIR}")

target_include_directories(Package1_static PRIVATE "${CMAKE_SOURCE_DIR}")

target_link_libraries(Package1 PRIVATE "${CMAKE_SOURCE_DIR}/Package1.res")

install(TARGETS Package1 Package1_static

       RUNTIME DESTINATION bin

       ARCHIVE DESTINATION lib

       LIBRARY DESTINATION lib

)

Demos

Auf unserer GitHub-Seite finden Sie mehrere Demoskripts zum Erzeugen von gängigen Bibliotheken von Fremdherstellern. Dazu muss unser CMake von GetIt, Ninja, plus git und für eine Demo auch Python lokal installiert sein.

Navigieren Sie in unseren GitHub-Demos (EN) zu CPP\CMake und rufen Sie eine Batch-Datei aus einer RAD Studio-Eingabeaufforderung (x64) mit den obigen Tools im Pfad auf.

Weitere Informationen finden Sie unter:

Siehe auch