Как требовать библиотеку только для заголовков без двоичного кода в cmake? - PullRequest
0 голосов
/ 16 ноября 2018

Я создал библиотеку только для заголовков, которая устанавливается с помощью 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?

1 Ответ

0 голосов
/ 16 ноября 2018

Чтобы включить библиотеку, вам обычно нужно включать заголовочные файлы и связывать некоторые объектные файлы.

При этом, если указанная библиотека только для заголовков, вам нужно только выполнитьinclude_directories(<library-include-folder>) и вы готовы идти.Так как обычно ваша библиотека не должна быть скомпилирована в файл .lib.

В вашем случае вам, вероятно, придется сделать следующее: (при условии, что mylib только для заголовков)

find_package(mylib REQUIRED)
# Provides MYLIB_INCLUDE_DIR to include
# The line above also provides a MYLIB_LIBRARIES, which for header-only libraries should be empty

include_directories(${MYLIB_INCLUDE_DIR})
add_executable(main main.cpp)
target_link_libraries(main ${MYLIB_LIBRARIES}) # This can be onmitted since there is nothing to link
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...