Ich habe eine Bibliothek, die einige konstante Daten aus dem Inhalt von Nicht-Quelldateien (in diesem Fall OpenGL-Shader-Code) enthalten muss. Um dies zu erreichen, benutze ich add_custom_command()
, um Include-Dateien zu erzeugen, die ich dann #include
in meinen Code eingeben kann, um statische Variablen zu initialisieren.
Dies funktioniert perfekt mit normalen Bibliotheken (statisch oder gemeinsam), aber jetzt möchte ich meine Bibliothek nur als Header-Datei machen. Die Fähigkeit von C ++, statische Methoden statische Daten zurückgeben zu lassen, ohne Gefahr zu laufen, dass diese Daten in jeder Übersetzungseinheit dupliziert werden ("magische Statik"), macht dies möglich.
Das Problem ist jedoch, dass CMake davon auszugehen scheint, dass eine INTERFACE-Bibliothek (die CMake-Funktion, die ich für die Erstellung von Header-only-Bibliotheken verwende) nicht erstellt werden muss - was in diesem Fall falsch ist.
(Mir ist klar, dass es für meine Bibliothek keine Verpflichtung gibt, nur Header zu sein. In diesem speziellen Fall möchte ich, dass ich möchte, dass die Bibliothek, die OpenGL macht, unabhängig von irgendwelchen spezifischen bleibt binding library [wie GLEW
oder GLee
oder der Newcomer glbinding
]. Wenn ich meine Bibliothek nur für den Header halte, kann ich diese Wahl dem Benutzer überlassen - alles, was er tun muss, ist #include
der Header des Bindebibliothek vor meiner.)
Sieht irgendjemand einen Weg, wie CMake die benutzerdefinierten Header-erzeugenden Befehle auslöst, spätestens wenn das Consumer-Projekt erstellt wird?
EDIT: Ich habe gerade gemerkt, dass ich das "Beste aus beiden Welten" haben kann, indem ich meine Bibliothek statisch halte und trotzdem meinen gesamten Code außer für die konstanten Daten in den Header-Dateien behalte. Auf diese Weise wäre es immer noch nicht notwendig, eine bestimmte OpenGL-Bindungsbibliothek auszuwählen. Es gibt jedoch immer noch Vorteile, wenn es eine Bibliothek gibt, die nur für den Header gedacht ist - die Einfachheit der Verwendung für einen -, also lasse ich meine Frage offen.
EDIT # 2: Hier ist der relevante Teil meiner CMakeLists.txt
-Datei (Ich habe nur die Bibliotheksabhängigkeiten entfernt - nur header-only - vom Ende):
Das Erstellen einer statischen Bibliothek mit Kopfzeilen als einzige Quelle funktionierte für mich. Es ist natürlich nur ein Workaround.
!<arch>
als einzigen Inhalt. Code:
%Vor%Verwenden Sie in anderen Verzeichnissen wie folgt:
%Vor%Getestet auf CMake 3.2, 3.8 und 3.9. Verwenden von Ninja und Generatoren.
Ich stieß auf vergleichbare Probleme, wenn ich versuchte, mich zu freuen: Ссылка
Es verwendet einen benutzerdefinierten CMake-Befehl, um eine Bindung zu erstellen, was bedeutet, dass die Dateien, die Sie in das Projekt aufnehmen müssen, nicht froh sind, so dass CMake nicht froh baut (was diese Dateien erzeugen würde) ...
Ich habe es noch nicht versucht, aber Beispiel 3 des folgenden Links scheint eine gute Lösung zu sein und ich glaube, dass es in Ihrem Fall funktionieren könnte: Ссылка
Tags und Links cmake header-only