2016-08-08 2 views
1

Я использую cmake для создания на Windows, Linux и OSX. В Windows я использую файлы .dll и .lib, которые я предварительно создал, и поместил их в папку project/windows/bin, project/windows/include и project/windows/lib. Эти папки содержат все мои сторонние зависимости для окон. В моем CMakeLists.txt я использую:CMake Visual Studio Debug/Release find_package

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

find_package(SDL2 REQUIRED) 
find_package(GLEW REQUIRED) 

Это работает, но я могу использовать только одну конфигурацию библиотеки. Я хотел бы иметь возможность связывать различные конфигурации библиотеки, такие как Debug и Release.

Вопрос: Как сделать так, чтобы, когда я установил проект визуальной студии для отладки, он будет использовать отладочную версию библиотеки и использовать версию релиза libray, когда я устанавливаю проект визуальной студии выпустить?

Должен ли я настроить каталог библиотек/windows по-разному?

Заранее спасибо

+0

Имеет ли [этот вопрос/ответ] (http://stackoverflow.com/questions/2209929/linking-different-libraries-for-debug-and-release-builds-in-cmake-on-windows) обращается к вашему вопрос? – aichao

ответ

2

теперь я уверен, является ли FindSDL2 и FindGLEW модулей, которые вы используете обеспечивают imported targets. Если это так, тогда можно подобрать соответствующую библиотеку как отладку, так и выпуск, и вы должны использовать импортированную цель для связывания.

В противном случае, у вас есть два варианта:

  1. Явное использовать optimized <LIB1_release> debug <LIB1_debug> как указано на @aichao в другой SO вопрос/ответ:

    target_link_libraries(MyConsumerTarget 
             PUBLIC optimized <LIB1_release> 
              debug <LIB1_debug>) 
    
  2. вручную создать импортированные цели библиотеки для каждой внешней библиотеки и использовать их для ссылки:

    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) 
    

Лично я предпочитаю последнее, поскольку он менее подробный в главном файле CMakeLists. Определение различных библиотек может быть сделано в других файлах, включенных с помощью других средств.
Как правило, у меня есть каталог 3rdparty в моих проектах с файлом CMakeLists.txt, который тянет внешние проекты и определяет такие импортированные цели. В основном файле CMake я могу легко использовать эти импортированные цели.

Смежные вопросы