2017-09-05 12 views
1

Ich möchte alle externen Bibliotheken als Teil meines Projekts kompiliert, so dass der Benutzer nichts herunterladen muss. Ich verwende CMake, um das Projekt zu verwalten. Ich habe ein Problem mit SDL2. Seine Include-Dateien sind für verschiedene Plattformen identisch, mit Ausnahme von "SDL_config.h", das beim Erstellen von SDL2 selbst generiert wird und vom Compiler/Plattform abhängig ist.Bereitstellung von SDL2 Include Headern für Win und Linux in einem Projekt

Ich muss daher zwei SDL_config.h Dateien bereitstellen - eine für Windows und eine für Linux. Wenn ich auch den Build-Prozess automatisieren Ich habe mit zwei Ideen kommen:

  1. Setzen Sie eine ifdef _WIN32/Unix-Klausel in den SDL-Header-Dateien die entsprechende Datei SDL_config.h

  2. enthalten halten Sie die SDL-Dateien intakt und ein Build-Skript, das die richtige SDL_config.h Datei im Verzeichnis include

Was ist die eleganteste/übliche Art und Weise zu tun, was Sie wollen, setzen würde ich?

Antwort

1

Setzen Sie ein ifdef _WIN32/Unix-Klausel in den SDL-Header-Dateien die entsprechende Datei SDL_config.h

ändern Bibliotheksdateien für ein solches Problem enthalten sollte nie eine Option sein, oder zumindest sollte es sei deine letzte Ressource.

Halten Sie die SDL-Dateien intakt und ein Build-Skript, das die richtige SDL_config.h Datei im Verzeichnis include

Sie verwenden Cmake setzen würde. Sie benötigen kein Build-Skript.


ein Verzeichnis erstellen und dort die beiden Versionen von SDL_config.h setzen. Dann:

  • Wenn Sie Variablen innerhalb Sie während des Kopierens (Pfade oder was auch immer) ersetzt werden soll, wahrscheinlich Cmake Befehl configure_file ist, was Sie suchen:

    Kopieren einer Datei an einen anderen Speicherort und ändern ihre Inhalte

  • Andernfalls, wenn alle, was Sie wollen, ist eine Datei über von einer Position in eine andere zu kopieren, Cmake Befehl file ist der Weg in seinezu gehenSignatur:

    Die Signatur COPY kopiert Dateien, Verzeichnisse und symbolische Verknüpfungen in einen Zielordner.

In beiden Fällen müssen Sie WIN32, verwenden MSVC, UNIX, was sonst if/else-Anweisung in der CMakeLists.txt. Ziemlich nervig zu schreiben und zu pflegen.


Das gesagt, wieder verwenden Sie cmake. Benutze es bis zum Ende.
Anstatt die kompilierten Versionen für jede einzelne Abhängigkeit für jede Kombination aus System und Compiler bereitzustellen, können Sie das cmake-Modul ExternalProject durchsuchen. Wenn Sie es verwenden, können Sie während der Ausführung von cmake Abhängigkeiten herunterladen und kompilieren.
Dies ist bei weitem eine elegantere Lösung, die nicht erfordert, dass Ihre Benutzer manuelle Abhängigkeiten in ihren Maschinen installieren. Darüber hinaus ist die Wartung einfacher und Sie haben kein hässliches if/else basierend auf dem Zielsystem in Ihrem CMakeLists.txt.

+0

Danke, genau, was ich im Sinn hatte. – pseudomarvin

Verwandte Themen