Связывание библиотеки отладки и выпуска с CMAKE (VISUAL STUDIO)

Уже была тема, которая на самом деле не помогла. Я хочу иметь возможность связать, например, Foo.lib для Release Config и Foo_d.lib для Debug Config, как мне этого добиться? Если я сделаю это:

target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)

тогда у меня есть обе библиотеки в моем проекте для конфигурации отладки? Почему нет варианта выпуска?

Большое спасибо!

4 ответа

Решение

Решение:

SET(LINK_LIBRARY optimized Foo debug Foo_d)
target_link_libraries(MyEXE ${LINK_LIBRARY})

target_link_libraries берет список, вам не нужно вызывать его дважды. Следующее будет работать:

target_link_libraries(MyEXE debug Foo_d optimized Foo)

И чтобы ответить на вопрос, заданный в комментариях к другому ответу, работа с несколькими библиотеками работает так:

target_link_libraries(MyEXE
    debug Foo1_d optimized Foo1
    debug Foo2_d optimized Foo2)

Обратите внимание, что если вы также собираете библиотеку как часть проекта CMake, вам не нужно указывать отладку или оптимизацию. CMake выберет подходящий для вас.

Нет проблем, когда ваша библиотека является частью проекта или вы импортируете ее, используя режим конфигурации find_package команда (см. документацию и пример). В случае, если вы не можете изменить третье лицо, так что он будет производить <package>Config.cmake(он может не использовать утилиту cmake или вы не хотите это делать) ответ состоит в том, чтобы эмулировать такой процесс:

add_library(foo STATIC IMPORTED)
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/foo-d.lib")
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/foo.lib")

target_link_libraries(MyEXE foo)

обратите внимание, что в отличие от "отладочной"/"оптимизированной" функции, такой подход не ограничивается настройками Debug/Release:

set_target_properties(foo PROPERTIES IMPORTED_LOCATION_MINSIZEREL "/path/to/foo-small.lib")

также у вас есть некоторые вкусности, такие как INTERFACE_INCLUDE_DIRECTORIES:

set_target_properties(foo PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "/path/to/foo/includes")

include_directories("/path/to/foo/includes") # this line not needed
target_link_libraries(MyEXE foo) # this command will add "/path/to/foo/includes" for you

и переходные ссылки:

add_library(boo STATIC IMPORTED)
set_target_properties(boo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/boo-d.lib")
set_target_properties(boo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/boo.lib")

add_library(foo STATIC IMPORTED)
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/foo-d.lib")
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/foo.lib")

set_target_properties(foo PROPERTIES INTERFACE_LINK_LIBRARIES boo) # foo depends on boo

target_link_libraries(MyEXE foo) # boo will be linked automatically

Конечно, вы можете использовать обычные команды cmake, такие как find_library а также find_package(... MODULE) оценивать места, а не жестко их кодировать.

Если у вас есть отладочные / выпускные библиотеки, которые следуют определенному шаблону, например _d для отладочных, вы можете избежать повторения с помощью:

set (MY_LIBS
    foo
    bar
    baz
)

# Generate the list of files to link, per flavor.
set (LINK_LIST "")
foreach(x ${MY_LIBS})
    list (APPEND LINK_LIST debug ${x}_d optimized ${x})
endforeach()

target_link_libraries (mytarget
    commonlib1
    commonlib2
    ${LINK_LIST}
    )

Это создаст соответствующий

debug foo_d optimized foo
debug bar_d optimized bar

линии, которые target_link_libraries надеется.

Верхний ответ использования target_link_libraries с отладкой и оптимизированным параметром не работает для моего cmake 3.14.6. Если вы столкнулись с этой ошибкой, попробуйте использовать следующий тип кода:

set (FreeImage debug "FreeImageD" optimized "FreeImage")
set (Glog debug "glogd" optimized "glog")
set (EXTRA_LIBS ${FreeImage} ${Glog})
target_link_libraries(TexCompressor ${EXTRA_LIBS})

Он просто меняет пару отладка / оптимизация на определение переменной. У меня работает.

Другие вопросы по тегам