CMake: Bauen Sie Mehrere ausführbare Dateien in einem Projekt mit Statischen Bibliothek
Arbeite ich an einem Projekt, das aus 3-server-Dateien und eine Bibliothek für freigegebene code. Ich will, dass es cross-Plattform, so dass ich mit CMake (seit Xcode ist ein Schmerz sowieso) zu behandeln, den build-Prozess. Ich habe Probleme mit der Einrichtung der CMakeLists, so dass ich die Bibliothek aus einem Verzeichnis auf dem gleichen Niveau, wenn ich Baue die ausführbare Datei.
Hier ist die Verzeichnis-Struktur (und den CMake-Dateien):
tethealla2.0/
CMakeLists.txt
libtethealla/
CMakeLists.txt
encryption/
utils/
patch_server/
CMakeLists.txt
login_server/
CMakeLists.txt
ship_server/
CMakeLists.txt
Meine top-level-CMake (tethealla2.0/CMakeLists.txt nur enthält die sub-Projekte kompilieren):
project(tethealla CXX)
cmake_minimum_required(VERSION 2.6)
add_subdirectory(libtethealla)
add_subdirectory(patch_server)
tethealla2.0/libtethealla/CMakeLists.txt die Generierung einer statischen Bibliothek:
project(Libtethealla C)
cmake_minimum_required(VERSION 2.6)
include_directories(encryption)
set(ENC_DR encryption/)
set(ENCRYPTION_SOURCES
${ENC_DR}/psobb-crypt.c
${ENC_DR}/psogc-crypt.c
${ENC_DR}/psobb-crypt.c
${ENC_DR}/encryption.c
)
add_library(tethealla STATIC ${ENCRYPTION_SOURCES})
tethealla2.0/patch_server/CMakeLists.txt so weit:
project(patch_server CXX)
cmake_minimum_required(VERSION 2.6)
add_executable(server main.cc)
target_link_libraries(server tethealla)
Daher macht es mehr Sinn, wenn Baue ich es aus der obersten Ebene, da tethealla2.0/CMakeLists.txt Erben werden die Ziele von jedem der Unterverzeichnisse und die in patch_server haben Zugang zu der tethealla Bibliothek. Aber was ich will ist, um in der Lage zu sein innerhalb dieser Unterverzeichnisse erzeugen von Xcode-Projekten, so dass ich arbeiten kann/kompilieren Sie Sie einzeln. Zu tun, so muss ich in der Lage sein, die libtethealla/build-Verzeichnis (wo CMake-Ausgänge) Zugriff auf die libtethealla.eine Bibliothek von patch_server. Ist das möglich?
Auf einer anderen Anmerkung, auch im Gebäude von der top-level-Verzeichnis meiner Quelle in patch_server kann nicht zählen " - Verschlüsselung.h" die header-Datei für die Bibliothek in Verschlüsselung. Das scheint zu sein Gebäude in Ordnung. Irgendwelche Gedanken auf, die sind auch sehr dankbar!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Lösung ist die Verwendung add_subdirectory mit relativen patch zu shared_lib-Verzeichnis. Ich glaube nicht, dass dies eine perfekte Lösung, es hat seine Nachteile:
Nehmen wir an, dass die Verzeichnis-Struktur sieht wie folgt aus:
root/CMakeList.txt
Habe ich beschlossen, dass shared_lib/CMakeLists.txt wird der export einer variable mit dem Namen
SHARED_DIR_INCLUDE_DIR
. Dieser Ansatz hilft zu entkoppeln, die Dinge ein wenig.root/exec1/CMakeLists.txt
if()
in der vierten Zeile löst das Problem mit der target-mehrfache definition, falls die CMakeLists-Datei mehrmals Hinzugefügt wird. Die zweite und die Dritte Zeilen exportiert die include-Verzeichnis für die Bibliothek inSHARED_LIB_INCLUDE_DIR
root/shared_lib/CMakeLists.txt