Добавить только заголовки импортированного модуля в библиотеку в CMake

В CMake есть импортированные модули, которые используются для простого добавления внешних модулей к локальным целям. Например, если мы хотим использовать boost::filesystem библиотека в нашем проекте мы могли бы иметь CMakeLists.txt как это:

project(foo CXX)

find_packge(Boost REQUIRED COMPONENTS filesystem)

add_executable(foo main.cpp)
target_link_libraries(foo Boost::filesystem)

С вышеупомянутой конфигурацией CMake добавит правильные параметры компилятора и включит каталоги из необходимых библиотек в процесс сборки foo,

Теперь нам нужно создать библиотеку вместо исполняемого файла, и мы не хотим связывать boost::filesystem библиотеки в нашу библиотеку. Мы хотим, чтобы к нашей цели добавлялись только параметры компилятора и включали каталоги. Можем ли мы использовать концепции импортированных модулей здесь? Я имею в виду, что если бы мы могли использовать Boost::filesystem синтаксис для добавления этих опций к нашей цели?

project(foo CXX)

find_packge(Boost REQUIRED COMPONENTS filesystem)

add_library(foo STATIC foo.cpp)
# what should be wrote here to only add headers and configs to foo not the libs?

1 ответ

Решение

Превращаю мои комментарии в ответ

add_library(STATIC) не будет связывать target_link_libraries() зависимости в себя.

Короче говоря, если две статические библиотеки будут включать, например, Boost::filesystem а затем вы связываете обе эти библиотеки в исполняемый файл (где внешние символы фактически разрешаются), и вы получаете дублированные ошибки символов.

Поэтому CMake по умолчанию не добавляет параметры компоновщика, такие как --whole-archive за gcc или же LinkLibraryDependencies за VC,

target_link_libraries(foo Boost::filesystem) должен работать, он просто описывает зависимость, разрешенную позже при создании исполняемой или разделяемой библиотеки.

Рекомендации

Другие вопросы по тегам