Связывание библиотеки отладки и выпуска с CMAKE (VISUAL STUDIO) - PullRequest
19 голосов
/ 31 марта 2011

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

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

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

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

Ответы [ 4 ]

27 голосов
/ 26 февраля 2015

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

24 голосов
/ 31 марта 2011

Решение:

SET(LINK_LIBRARY optimized Foo debug Foo_d)
target_link_libraries(MyEXE ${LINK_LIBRARY})
12 голосов
/ 20 февраля 2015

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

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

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), чтобы оценивать местоположения вместо жесткого их кодирования.

8 голосов
/ 21 августа 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...