CMake: Nur-Header-Bibliothek mit generierten Dateien

8

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):

%Vor%     
JPNotADragon 10.02.2015, 00:15
quelle

3 Antworten

3

Sie können target_sources in CMake 3.1 verwenden, um den Benutzern mitzuteilen, dass sie Interface-Dateien kompilieren sollen:

%Vor%

Ссылка

    
steveire 10.02.2015 00:26
quelle
2

Das Erstellen einer statischen Bibliothek mit Kopfzeilen als einzige Quelle funktionierte für mich. Es ist natürlich nur ein Workaround.

  • Das Erstellen einer statischen Bibliothek mit nur Header-Dateien führt zu einer leeren Bibliothek. Meine sagt !<arch> als einzigen Inhalt.
  • CMake wird die Abhängigkeiten automatisch über Unterverzeichnisse erhalten.
  • Da alle Quellen Header sind, müssen Sie CMake mitteilen, welche Linkersprache verwendet werden soll.

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.

    
Unapiedra 01.07.2017 23:08
quelle
1

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: Ссылка

    
GPMueller 27.06.2016 12:29
quelle

Tags und Links