CMake: Erstellen Sie mehrere ausführbare Dateien in einem Projekt mit der statischen Bibliothek

8

Ich arbeite an einem Projekt, das aus 3 ausführbaren Serverdateien und einer Bibliothek für gemeinsam genutzten Code besteht. Ich möchte, dass es plattformübergreifend ist, also verwende ich CMake (da Xcode sowieso ein Problem ist), um den Build-Prozess zu bewältigen. Ich habe Probleme mit der Einrichtung der CMakeLists, so dass ich die Bibliothek aus einem Verzeichnis auf der gleichen Ebene einschließen kann, wenn ich die ausführbare Datei erstelle.

Hier ist die Verzeichnisstruktur (und die CMake-Dateien):

%Vor%

Mein CMake auf oberster Ebene (tethealla2.0 / CMakeLists.txt, enthält nur das Unterprojekt, das kompiliert werden sollte):

%Vor%

tethealla2.0 / libtethealla / CMakeLists.txt, die eine statische Bibliothek generiert:

%Vor%

tethealla2.0 / patch_server / CMakeLists.txt soweit:

%Vor%

Es macht also mehr Sinn, wenn ich es von der obersten Ebene her aufbaue, da tethealla2.0 / CMakeLists.txt die Ziele von jedem der Unterverzeichnisse erben wird und dasjenige in patch_server hat Zugriff auf die Tethealla-Bibliothek. Ich möchte jedoch aus diesen Unterverzeichnissen erstellen können, um Xcode-Projekte zu generieren, so dass ich sie einzeln bearbeiten / neu kompilieren kann. Dazu muss ich in der Lage sein, in das libtethealla / build-Verzeichnis (wo CMake-Ausgaben sind) zu gelangen, um von patch_server auf die Bibliothek libtethealla.a zuzugreifen. Ist das möglich?

Irgendwie noch eine Anmerkung, auch wenn ich aus dem Verzeichnis der obersten Ebene baue, kann meine Quelle in patch_server "encryption.h", die Header-Datei für die Bibliothek, nicht enthalten. Was scheint gut zu bauen. Irgendwelche Gedanken dazu werden auch sehr geschätzt!

    
drodman 15.05.2014, 17:16
quelle

1 Antwort

14

Meine Lösung ist die Verwendung von add_subdirectory mit einem relativen Patch zum Verzeichnis shared_lib. Ich denke nicht, dass dies eine perfekte Lösung ist, es hat seine Vorbehalte:

  • Logik, die einem Header Guard sehr ähnlich ist, muss der Bibliothek CMakeLists.txt hinzugefügt werden, um zu verhindern, dass Ziele mehrfach definiert werden.
  • Jede CMakeList.txt-Datei muss den relativen Patch zur Bibliothek kennen. Wenn man die Bibliothek verschieben will, müssen alle CMakeLists aktualisiert werden.

Nehmen wir an, dass die Verzeichnisstruktur wie folgt aussieht:

%Vor%

root / CMakeList.txt

%Vor%

Ich habe entschieden, dass shared_lib / CMakeLists.txt eine Variable namens SHARED_DIR_INCLUDE_DIR exportiert. Dieser Ansatz hilft, die Dinge ein wenig zu entkoppeln.

root / exec1 / CMakeLists.txt

%Vor%

if() in der vierten Zeile löst das Problem mit der Mehrfachdefinition des Ziels, falls die CMakeLists-Datei mehrfach hinzugefügt wird. Die zweite und die dritte Zeile exportieren das Include-Verzeichnis für die Bibliothek in SHARED_LIB_INCLUDE_DIR

root / shared_lib / CMakeLists.txt

%Vor%     
user3188346 18.05.2014, 20:43
quelle

Tags und Links