2016-08-08 27 views
1

Ich benutze cmake um auf Windows, Linux und OSX zu bauen. Unter Windows verwende ich .dll- und .lib-Dateien, die ich vorkompiliert habe, und lege sie in den Ordner project/windows/bin, project/windows/include und project/windows/lib. Diese Ordner enthalten alle Abhängigkeiten von Drittanbietern für Windows. In meinem CMakeLists.txt, verwende ich:CMake Visual Studio Debuggen/Release find_package

if(WIN32) 
    set(CMAKE_PREFIX_PATH ${PROJECT_SOURCE_DIR}/windows) 
endif() 

find_package(SDL2 REQUIRED) 
find_package(GLEW REQUIRED) 

Es funktioniert, aber ich bin nur in der Lage eine Konfiguration der Bibliothek zu verwenden. Ich möchte in der Lage sein, verschiedene Konfigurationen der Bibliothek wie Debug und Release zu verknüpfen. Die Frage ist: Wie mache ich es so, dass, wenn ich meine Visual Studio-Projekt zu debuggen, wird es die Debug-Version der Bibliothek verwenden und verwenden Sie die Release-Version der Bibliothek, wenn ich das Visual Studio-Projekt loslassen?

Muss ich mein/Windows-Bibliotheksverzeichnis anders einrichten?

Vielen Dank im Voraus

+0

Ist [diese Frage/Antwort SO] (http://stackoverflow.com/questions/2209929/linking-different-libraries-for-debug-and-release-builds-in-cmake-on-windows) Adresse Ihre Frage? – aichao

Antwort

2

bin ich jetzt sicher, ob die FindSDL2 und FindGLEW Module Sie imported targets bieten verwenden. Wenn dies der Fall ist, kann die entsprechende Bibliothek sowohl als Debug- als auch als Release-Version ausgewählt werden, und Sie sollten das importierte Ziel zum Verknüpfen verwenden.

Andernfalls haben Sie zwei Möglichkeiten:

  1. Explizit optimized <LIB1_release> debug <LIB1_debug> verwenden, wie durch @aichao in der anderen SO Frage/Antwort verwiesen:

    target_link_libraries(MyConsumerTarget 
             PUBLIC optimized <LIB1_release> 
              debug <LIB1_debug>) 
    
  2. manuell für jeden externen importierte Bibliothek Ziele erstellen Bibliothek und verwenden Sie sie für die Verknüpfung:

    if(NOT TARGET External::lib1) # this if is required for subsequent runs of CMake 
        add_library(External::lib1 SHARED IMPORTED GLOBAL) 
        set_target_properties(External::lib1 
             PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/windows/include" 
                IMPORTED_LINK_INTERFACE_LANGUAGES "C" 
                IMPORTED_LOCATION_RELEASE "${PROJECT_SOURCE_DIR}/windows/bin/<LIB1_release>.dll" 
                IMPORTED_IMPLIB_RELEASE "${PROJECT_SOURCE_DIR}/windows/lib/<LIB1_release_importlib>.lib" 
                IMPORTED_LOCATION_DEBUG "${PROJECT_SOURCE_DIR}/windows/bin/<LIB1_debug>.dll" 
                IMPORTED_IMPLIB_DEBUG "${PROJECT_SOURCE_DIR}/windows/lib/<LIB1_debug_importlib>.lib") 
    endif() 
    
    target_link_libraries(MyConsumerTarget 
             Public External::lib1) 
    

Persönlich bevorzuge ich das letztere, da es in der Hauptdatei CMakeLists weniger ausführlich ist. Die Definition der verschiedenen Bibliotheken kann in anderen Dateien erfolgen, die auf andere Weise enthalten sind.
Normalerweise habe ich ein Verzeichnis 3rdparty in meinen Projekten mit einer CMakeLists.txt Datei, die externe Projekte einzieht und solche importierten Ziele definiert. In der Haupt-CMake-Datei kann ich dann leicht diese importierten Ziele verwenden.