Я создал библиотеку только для заголовков, которая устанавливается с помощью cmake с использованием
add_library(mylib INTERFACE)
и экспортируемые цели.
Это прекрасно работает, когда я использую find_package(mylib REQUIRED)
и target_link_library
в файле cmake другой библиотеки (mylib2
), которая включает заголовки.
Но когда я связываюсь с mylib2
, используя экспортированные цели и target_link_library
, сгенерированные файлы VS содержат mylib.lib
в библиотеках ссылок.
Когда я ищу строку mylib.lib
в сгенерированных файлах всех трех проектов, только файлы Visual Studio содержат это, ни один из файлов PackageConfig
или PackageTargets
не содержит имя файла.
Библиотека заголовков использует экспортированные цели this в своем CMakeLists.txt
add_library(mylib INTERFACE)
target_compile_definitions(mylib INTERFACE -D_USE_MATH_DEFINES)
target_link_libraries(mylib INTERFACE somelibraries)
target_include_directories(mylib INTERFACE
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
configure_package_config_file(mylibConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/mylibConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX})
install(TARGETS mylib EXPORT mylib-targets)
install(EXPORT mylib-targets FILE mylibTargets.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mylibConfig.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})
install(DIRECTORY ./ DESTINATION include FILES_MATCHING PATTERN "*.h")
Вторая библиотека просто использует
find_package(mylib REQUIRED)
add_library(mylib2 source.cpp)
target_link_libraries(mylib2 mylib)
# some stuff to export targets, similar to the first lib
И в конечном проекте используется
add_binary(myproject source.cpp)
set(LINK_LIBRARIES mylib2)
target_link_libraries(myproject ${LINK_LIBRARIES}) # mylib2.lib is added to the project.
add_binary(myproject2 source.cpp)
target_link_libraries(myproject mylib2) # only the include paths are added.
Проблема возникает только тогда, когда библиотеки установлены из переменной.
В какой момент процесса cmake добавляет имя файла библиотеки в библиотеки ссылок? Не должно ли оно наследовать свойство INTERFACE
?