BCC64X
Nach oben zu Durch Clang erweiterte C++-Compiler
BCC64X ist ein C++-Compiler für 64-Bit-Windows (Modern) von RAD Studio.
BCC64X basiert auf Clang. Weitere Informationen zu Gemeinsamkeiten des BCC64X-Compilers mit anderen, durch Clang erweiterten C++-Compilern finden Sie unter Durch Clang erweiterte C++-Compiler.
Inhaltsverzeichnis
- 1 Allgemeine Informationen
- 2 Ausgabedateien
- 3 Schreiben von C++-Code für BCC64X
- 4 Toolkette
- 5 Parallele Compilierung
- 6 Bekannte Probleme
- 7 Siehe auch
Allgemeine Informationen
| Feld | Wert |
|---|---|
| Clang-Version | 15.0 |
| LLVM-Version | 15.0 |
| Aufrufkonventionen | Microsoft x64 (EN) |
| Ergänzen von Namen | Itanium |
| Standardbibliothek | LLVM libc++ |
| C++-Laufzeit | Custom based on MinGW-LLVM |
| C-Laufzeit | UCRT |
Ausgabedateien
| Dateityp | Dateierweiterung | Dateiformat |
|---|---|---|
| Ausführbare Datei | .exe
|
PE64 (PE32+) |
| Gemeinsame Bibliothek | .dll
|
PE64 (PE32+) |
| Statische Bibliothek | .lib und lib[name].a
|
Bibliothek der Objektdateien; weitere Informationen zu Erweiterungen finden Sie unter Automatisches Linken. |
| Compiliertes Objekt | .o
|
COFF64 |
| Debug-Informationen | .pdb
|
PDB |
EXE- oder DLL-Dateien linken.Schreiben von C++-Code für BCC64X
Verwenden Sie die folgende Anweisung, um C++-Code speziell für BCC64X zu schreiben:
#if defined(__BORLANDC__) && defined(_WIN64) && defined(__MINGW64__)
Fügen Sie eine Prüfung wie die folgende hinzu, um ein bestimmtes Release zu verwenden:
#if __clang_major__ == 15
#pragma message("Using version 15 of Clang")
#endif
Weitere Informationen finden Sie unter Durch Clang erweiterte C++-Compiler, Vordefinierte Makros.
Toolkette
Bei der C++-Toolkette für 64-Bit-Windows Modern (bcc64x) handelt es sich um eine völlig neue Implementierung der Clang-Erweiterungen und C++Builder-Features mit neuer plattformbasierter Technologie. Mit dem LLD-Linker, der neuen RTL und mehr ist die neue Clang-Toolkette unsere empfohlene C++-Toolkette.
Sie verwendet die LLVM-libc++-STL, eine angepasste C++-RTL, die Windows-UCRT für die C-Laufzeit und gibt Objektdateien im COFF64-Format mit PDB-Debug-Informationen aus.
Führen Sie die folgenden Schritte durch, um diese Toolkette einem vorhandenen C++-Projekt hinzuzufügen:
- Klicken Sie in der Projekthierarchie mit der rechten Maustaste auf den Knoten Zielplattformen.
- Wählen Sie Plattform hinzufügen aus.
- Wählen Sie Windows 64 Bit (Modern) aus.
Verwendung des neuen BCC64X-Compilers testen
RAD Studio bietet eine empfohlene Methode für Entwickler, Code zu schreiben, der erkennt, ob die neue Toolkette verwendet wird:
- Empfohlen: Verwenden Sie einen Makrotest für
_CODEGEARC_und_clang_major_ >= 15für diese und neuere Versionen. Dieser Test wird für RAD Studio empfohlen, da sich die Clang-Version im Laufe der Zeit ändern kann und dieser Code für die aktuellen und zukünftigen Versionen dieser Toolkette gilt. Diesen Test sollten Sie unbedingt Ihrem Code hinzufügen. - Mit dem Makrotest
_CODEGEARC_und_clang_major_ == 15testen Sie auf diese spezielle Version. Verwenden Sie dies nur, um speziell auf die erste Version der Toolkette zu testen. Dieser Test erkennt zukünftige Versionen der gleichen Toolkette nicht, weshalb der vorherige Test empfohlen wird.
- Verwenden Sie die Makros
_has_featureund_has_builtin, um auf bestimmte C++- oder Compiler-/LLVM-Features und -Builtins zu testen, die nicht C++Builder-spezifisch sind, aber für mehrere Clang-basierte Toolketten gelten. Weitere Informationen zu Makros für das Testen auf Features finden Sie hier (EN).
Das folgende Codebeispiel zeigt den von uns empfohlenen Test für die neue Toolkette. Verwenden Sie diesen Test, um für die Toolkette spezifischen Code zu kapseln, z. B. um bestimmte Header einzuschließen.
#include <iostream>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
#if defined(__CODEGEARC__) && (__clang_major__ >= 15)
std::cout << "C++Builder Modern Compiler, 12.1 or newer";
#else
std::cout << "A different compiler";
#endif
}
Um Ihre bestehende Codebasis weiter zu migrieren, sollten Sie spezifischen Code für die neue Toolkette in ein solches Makro aufnehmen.
Anpassen von Pfaden
Fügen Sie die Variable $(CC_SUFFIX) dem Bibliothekspfad hinzu, damit der Compiler die korrekten Pfade findet.
Zum Beispiel:
$(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;..\..\..\..\..\Public\Documents\Embarcadero\Studio\15.0\Samples\CPP\Mobile Samples\User Interface\KeyboardToolbar\
Die Variable $CC_SUFFIX behandelt den Unterschied zwischen den beiden Win64-Toolketten. Die neue Toolkette, bcc64x, hat am Ende ein X, was bedeutet, dass der korrekte Plattformspeicherort für Dateien, mit denen verknüpft wird, "win64x" ist. $CC_SUFFIX wird zu X ausgewertet, wenn diese Plattform verwendet wird.
Testen auf Windows im Vergleich zu Testen auf eine bestimmte Toolkette
Bei der Verwendung von C++-Quellcode von Drittanbietern kann es vorkommen, dass Header, Methodendefinitionen usw. vorhanden sind, die Windows-spezifisch sind und fälschlicherweise in ein Makro gekapselt werden, das die Toolkette (normalerweise MSVC) testet. Ersetzen Sie diese Makros durch einen Plattformtest, anstatt des Toolketten-Tests.
Testen Sie, ob _WIN32 oder _WIN64 definiert sind, um auf Windows, MSVC, C++Builder oder eine andere Toolkette zu prüfen. Sowohl in C++Builder als auch in MSVC sind diese Makros definiert. Dies wird für Windows-spezifischen Code empfohlen.
Tests auf Plattformkombinationen (Windows) mit Toolketten-Tests scheinen unter Windows aufgrund der zunehmenden Verwendung anderer Toolketten wie RAD Studio und mingw-llvm rückläufig zu sein. Es ist jedoch immer noch ein häufiges Problem, wenn C++-Quellcode oder -Bibliotheken von Drittanbietern eingebunden werden.
Mit DLLs linken
Erzeugen eines DLL-Builds und Generieren der Exportdatei (.def)
RAD Studio wird mit llvm-dlltool.exe ausgeliefert, da diese Datei Teil von llvm-project ist, aus dem unser Clang-basierter bcc64x.exe-Compiler erzeugt wird. Es wird empfohlen, zum Generieren einer .def-Datei das Tool tdump.exe zu verwenden.
Direkt mit einer DLL linken
Die neue Toolkette kann direkt mit einer .dll-Datei gelinkt werden.
Sie können entweder die Funktion -lmydll verwenden oder, wenn eine Kopie der .dll-Datei im Pfad LIBRARY vorhanden ist, können Sie #pragma comment(lib, "mydll") ohne eine Importbibliothek verwenden.
Unter Automatisches Linken finden Sie weitere Informationen.
Der Linker kann manuell durch den Compiler aufgerufen werden, indem Sie dem Linker den folgenden Pfad hinzufügen:
libclang_rt.builtins-x86_64.a
Erstellen von DLL-Importbibliotheken
In RAD Studio können Sie jetzt eine .dll direkt ohne Verwendung einer Importbibliothek linken. Diese neue Implementierung gilt nur für Win64x-Plattformen.
Die Importbibliothek wird jedoch häufig verwendet, um eine .dll-Datei zu importieren, weil der Linker zuerst nach Bibliotheken und zuletzt nach .dll-Dateien sucht.
Die Toolkette unterstützt alle vorhandenen COFF-Bibliotheken. Sie können aber auch eine eigene erstellen.
Führen Sie die folgenden Schritte aus, um eine eigene Importbibliothekdatei (.lib) zu erstellen:
- Generieren Sie die Definitionsdatei (
.def) für die DLL.Hinweis: Sie können die.def-Datei aus einer.dll-Datei mit dem Tooltdumpgenerieren. - Führen Sie im tdump-Tool den folgenden Befehl aus, um die
.def-Datei zu erstellen:tdump -def mydll.dll mydll.def
Hinweis: Eine.def-Datei enthält reinen Text. Öffnen Sie die Datei und überprüfen Sie, dass sie LIBRARY<dll-Name>.dllmit dem korrekten<dll-Namen>enthält. - Generieren Sie mit dem neuen LLD-Linker die Importbibliothek, indem Sie den folgenden Befehl in der RAD Studio-Eingabeaufforderung eingeben:
ld.lld.exe -m i386pep --out-implib file.lib file.def
Die IDE erstellt beim Erzeugen des Builds automatisch die DLL-Importbibliothek. Sie können die Importbibliothek aber auch manuell erstellen, indem Sie eine der folgenden Anweisungen in der Befehlszeile ausführen:
bcc64x -tD -Xlinker --out-implib=dll.lib dll.cpp
oder
bcc64x -tD dll.cpp -Wl,--out-implib,dll.lib
Parallele Compilierung
C++Builder-Projekte für die neue Win64-Toolkette werden standardmäßig parallel erzeugt. Dies führt zu einer schnelleren Erzeugung mit bcc64x im Vergleich zur Erzeugung mit:
- "--jobs", das den alten bcc64 verwendet (alte Win64-Toolkette).
- CMake und Ninja, die beide den alten und den neuen bcc64/x verwenden.
- Visual C++ mit CMake und Ninja und der Befehlszeilenoption /MP.
Dies ist standardmäßig für Projekte aktiviert, die diese Plattform verwenden. Lesen Sie die folgende Dokumentation, um Einstellungen zu konfigurieren oder zu verstehen, wie es funktioniert.
Grundlagen
Bei der parallelen Compilierung von C++Builder-Projekten werden zwei Funktionen kombiniert: Stapel-Compilierung, bei der der Compiler mehrere C++-Dateien auf einmal erhält, anstatt die Compilierung für jeweils eine Datei aufzurufen, und --jobs, bei der der Compiler die vorliegenden Dateien parallel verarbeitet.
Der Compiler erhält also viele Dateien zum Compilieren (Stapel-Compilierung) und er wird angewiesen, sie parallel zu compilieren (--jobs.)
Warum beides? Wenn Sie nur die Stapel-Compilierung ausführen, werden viele Dateien mit einem einzigen Aufruf der Compiler-EXE compiliert, aber der Compiler verarbeitet sie nacheinander. Wenn Sie nur --jobs ausführen, wird das parallele System verwendet, aber nur mit einer einzigen Datei, und dies ergibt nur eine einzige sinnlose Datei. Sie müssen beide Einstellungen aktivieren: (a) viele Daten simultan und (b) parallel.
Verhalten der parallelen Compilierung sowie Nutzung der CPU
Im Folgenden finden Sie einige Informationen über die Funktionsweise der Stapel-Compilierung mit --jobs zur Optimierung Ihrer Build-Umgebungen, um eine schnellere und effizientere Compilierung und gleichzeitig eine ausgeglichene Ressourcenauslastung zu erreichen.
Compiler-Ausgabe
Compiler-Meldungen sind nicht verschachtelt. Obwohl sie parallel ablaufen, werden die Ausgabemeldungen einer gesamten Datei nach deren Fertigstellung auf einmal ausgegeben.
Bei einem Compilierfehler wird die gesamte Compilierung beendet. Nach dem Fehler erhalten Sie möglicherweise Meldungen über eine erfolgreiche Compilierung, da die anderen Dateien, die parallel compiliert werden, bis zu deren Ende compiliert wurden.
Build-Systeme
Das parallele "--jobs"-Build-System kann in der IDE und vom Befehlszeilen-MSBuild sowie direkt über die Befehlszeile "bcc64x" verwendet werden.
Beachten Sie, dass Sie dies uneingeschränkt für CI, Build-Server und mehr verwenden können, wenn Sie den Build über einen MSBuild-Befehl in der Befehlszeile erzeugen. Sie müssen den Compiler nicht direkt aufrufen. Das Standard-Build-System kann parallel von der Befehlszeile aus den Build erzeugen.
Erzeugen Sie den Build oder compilieren Sie wie üblich. Das parallele Erzeugen eines Builds wird standardmäßig verwendet. Wenn Sie den Task-Manager öffnen, sollte ein einzelner bcc64x-Prozess mit mehreren Threads angezeigt werden, der bis zu 100 % CPU beansprucht.
Öffnen Sie die Projektoptionen, um zu überprüfen, ob Ihr Projekt parallele Builds verwendet:
- Vergewissern Sie sich, dass die Plattform "Windows 64 Bit (Modern)" in Ihrem Projekt ausgewählt und aktiv ist.
- Öffnen Sie die Projektoptionen. Wählen Sie in der Dropdown-Liste "Alle Konfigurationen" aus.
- Erzeugen > C++-Compiler > Stapel-Compilierung aktivieren sollte auf "true" festgelegt sein. Vergewissern Sie sich, dass keine der anderen Zielkonfigurationen diesen Wert überschreibt. Dies sollte die Standardeinstellung auf einer übergeordneten geerbten Ebene sein.
- Projekteigenschaften > Allgemein > Anzahl der Unterprozesse sollte auf
0festgelegt sein. Damit wird jeder vorhandene Kern verwendet.
Rufen Sie "msbuild" mit Ihrem Projekt auf. Solange die oben genannten Einstellungen in den Projektoptionen in der IDE festgelegt sind, wird die parallele Compilierung ausgeführt.
> msbuild MyProject.cbproj
Die vollständige Liste der Parameter finden Sie unter Erzeugen eines Projekts mit einem MSBuild-Befehl. Stellen Sie sicher, dass die parallele Erzeugung für das Projekt in der IDE konfiguriert ist. Diese Einstellungen werden immer verwendet, wenn Sie "msbuild" in der Befehlszeile mit demselben Projekt verwenden.
Zur direkten Implementierung über die Befehlszeile verwenden Sie einfach Folgendes:
> bcc64x a.cpp b.cpp c.cpp --jobs=0 ...other parameters
Diese Batches senden mehrere Dateien auf einmal an den Compiler, weisen ihn an, parallel zu erzeugen (jobs) und so viele Kerne wie verfügbar zu verwenden ("0" bedeutet alle Kerne.)
CPU-Sättigung
Suchen Sie auf der Registerkarte Projektoptionen > Projekteigenschaften > Allgemein die Einstellung Anzahl der Unterprozesse. Die Standardeinstellung ist "0". Das bedeutet, dass alle verfügbaren Kerne verwendet werden. Es werden doppelt so viele Threads ausgeführt, wie Kerne vorhanden sind.
Wenn Sie möchten, dass das Build-System nicht alle, aber fast alle verfügbaren Ressourcen nutzt, legen Sie diese Einstellung auf -1 fest. Damit wird ein Kern weniger als bei der Standardeinstellung ("0") genutzt. Verwenden Sie diese Einstellung nur, wenn Sie während der Compilierung etwas anderes ausführen möchten und andere Prozesse verlangsamt ausgeführt werden.
Sie können für diese Einstellung auch einen positiven Integerwert festlegen. Je nachdem, wie viele Kerne verfügbar sind, werden Kerne bis zu dieser Anzahl verwendet. Wenn Sie festlegen, dass mehr Kerne verwendet werden sollen, als vorhanden sind, werden einfach so viele Kerne verwendet, wie möglich.
Sie können denselben Wert festlegen, wenn Sie den Compiler direkt aufrufen und den Befehlszeilenparameter "--jobs=n" angeben.
Unser empfohlener Wert ist 0 (die Standardeinstellung.) Dadurch wird eine vollständige CPU-Sättigung erreicht und Builds so schnell wie möglich erzeugt.
Bekannte Probleme
Komponenten aus Packages, die mit Delphi-Projekten für WIN64X erstellt wurden, müssen zunächst für die Plattform aktiviert werden. Anleitungen zum Aktivieren von Komponenten für die Plattform Windows 64 Bit (Modern) finden Sie unter Delphi-Packages für C++ erzeugen.
Weitere Informationen finden Sie unter ComponentPlatformsAttribute.
Siehe auch
- C++Builder-Anwendungsentwicklung für 64-Bit-Windows (Modern)
- Delphi-Packages für C++ erzeugen
- C++Builder-Anwendungsentwicklung für 64-Bit-Windows
- Unit-Initialisierung und -Finalisierung für die neue C++-Toolkette
- Packages für die neue C++-Toolkette
- Import und Export von Packages für die neue C++-Toolkette
- BCC64-spezifische Unterschiede
- Moderne C++-Features
- Alter Compiler für 64-Bit-Windows