Vorkompilierte Header

Das Parsen von Header-Dateien von Systembibliotheken ist überraschend aufwendig. Eine typische Quelldatei hat weniger als tausend Zeilen Code. Im Gegensatz dazu können die Header großer Bibliotheken Zehntausende von Zeilen umfassen. Dies ist besonders problematisch bei C++, wo Header-only-Bibliotheken üblich sind und extrem komplexen Code enthalten können. Dies macht sie langsam zu kompilieren.

Vorkompilierte Header sind ein Werkzeug, um dieses Problem zu mildern. Grundsätzlich parsen sie die Header und serialisieren dann den internen Zustand des Compilers auf die Festplatte. Der Nachteil von vorkompilierten Headern ist, dass sie schwierig einzurichten sind. Meson hat native Unterstützung für vorkompilierte Header, aber ihre Verwendung erfordert etwas Aufwand.

Eine vorkompilierte Header-Datei ist relativ einfach. Es ist eine Header-Datei, die #include-Direktiven für die zu vorkompilierenden System-Header enthält. Hier ist ein C++-Beispiel.

    #include<vector>
    #include<string>
    #include<map>

In Meson sind vorkompilierte Header-Dateien immer pro Ziel. Das heißt, der gegebene vorkompilierte Header wird beim Kompilieren jeder einzelnen Datei des Ziels verwendet. Aufgrund von Einschränkungen der zugrunde liegenden Compiler darf diese Header-Datei nicht im selben Unterverzeichnis wie eine der Quelldateien liegen. Es wird dringend empfohlen, ein Unterverzeichnis namens pch im Zielverzeichnis zu erstellen und die Header-Dateien (und nichts anderes) dort abzulegen.

Umschalten der Verwendung von vorkompilierten Headern

Wenn Sie Ihr Projekt ohne vorkompilierte Header kompilieren möchten, können Sie den Wert der Option pch ändern, indem Sie beim Konfigurieren mit -Db_pch=false an Meson übergeben oder später mit meson configure. Sie können die Verwendung von pch auch in einem konfigurierten Build-Verzeichnis mit dem GUI-Tool umschalten. Sie müssen keine Änderungen am Quellcode vornehmen. Dies geschieht typischerweise, um zu testen, ob Ihr Projekt ohne pch sauber kompiliert (d.h. zu prüfen, ob die #include-Anweisungen korrekt geordnet sind) und um Compiler-Bugs zu umgehen.

Verwendung von vorkompilierten Headern mit GCC und Derivaten

Sobald Sie eine Datei zum Vorkompilieren haben, können Sie die Verwendung von pch für ein bestimmtes Ziel mit einem pch-Schlüsselwortargument aktivieren. Als Beispiel nehmen wir an, Sie möchten eine kleine C-Binärdatei mit vorkompilierten Headern erstellen. Nehmen wir an, die Quelldateien der Binärdatei verwenden die System-Header stdio.h und string.h. Dann erstellen Sie eine Header-Datei pch/myexe_pch.h mit diesem Inhalt

#include <stdio.h>
#include <string.h>

Und fügen Sie dies zu Meson hinzu

executable('myexe', sources : sourcelist, c_pch : 'pch/myexe_pch.h')

Das ist alles. Sie sollten beachten, dass Ihre Quelldateien die Datei myexe_pch.h nicht einschließen dürfen und Sie das pch-Unterverzeichnis nicht zu Ihrem Suchpfad hinzufügen dürfen. Jede Änderung der ursprünglichen Programmdateien ist nicht notwendig. Meson wird den Compiler anweisen, den pch mit Compiler-Optionen einzuschließen. Wenn Sie pch deaktivieren möchten (z.B. wegen Compiler-Bugs), kann dies vollständig auf der Seite des Build-Systems ohne Änderungen am Quellcode erfolgen.

Sie können vorkompilierte Header für jedes Build-Ziel verwenden. Wenn Ihr Ziel mehrere Sprachen hat, können Sie mehrere pch-Dateien wie folgt angeben.

executable('multilang', sources : srclist,
           c_pch : 'pch/c_pch.h', cpp_pch : 'pch/cpp_pch.h')

Verwendung von vorkompilierten Headern mit MSVC

Seit Meson Version 0.50.0 funktionieren vorkompilierte Header mit MSVC genauso wie mit GCC. Meson erstellt automatisch die entsprechende pch-Implementierungsdatei für Sie.

Vor Version 0.50.0 benötigte Meson zusätzlich zur Header-Datei auch eine entsprechende Quelldatei. Wenn Ihre Header-Datei foo_pch.h heißt, heißt die entsprechende Quelldatei normalerweise foo_pch.cpp und befindet sich im selben pch-Unterverzeichnis wie der Header. Ihr Inhalt ist dieser

#if !defined(_MSC_VER)
#error "This file is only for use with MSVC."
#endif

#include "foo_pch.h"

Um pch zu aktivieren, listen Sie einfach beide Dateien in der Zieldefinition auf

executable('myexe', sources : srclist,
           cpp_pch : ['pch/foo_pch.h', 'pch/foo_pch.cpp'])

Diese Form funktioniert sowohl mit GCC als auch mit msvc, da Meson weiß, dass GCC keine .cpp-Datei benötigt und diese einfach ignoriert.

Es ist zu beachten, dass aufgrund von Implementierungsdetails des MSVC-Compilers das Vorhandensein von vorkompilierten Headern für mehrere Sprachen im selben Ziel nicht garantiert funktioniert.

Die Ergebnisse der Suche sind