Подтвердить что ты не робот

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

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

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

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

Спасибо, много!

4b9b3361

Ответ 1

Решение:

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

Ответ 2

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 выберет для вас правильный вариант.

Ответ 3

Нет проблем, когда ваша библиотека является частью проекта или вы импортируя его в режиме конфигурации find_package (см. документация и example). Если вы не можете изменить третью сторону, чтобы она произвела <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) для оценки местоположений вместо их жесткого кодирования.

Ответ 4

Если у вас есть debug/release lib, которые следуют за определенным шаблоном, например _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.