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