Ответ 1
Решение:
SET(LINK_LIBRARY optimized Foo debug Foo_d)
target_link_libraries(MyEXE ${LINK_LIBRARY})
Был уже Thread, который на самом деле не помог. Я хочу, чтобы уметь ссылаться, например, на Foo.lib для Release Config и Foo_d.lib для Отладки., как я могу это достичь? Если я это сделаю:
target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)
то у меня есть обе библиотеки в моем проекте для конфигурации отладки? Почему нет опции Release?
Спасибо, много!
Решение:
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
(см. документация и 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)
для оценки местоположений вместо их жесткого кодирования.
Если у вас есть 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
.