Добавить только заголовки импортированного модуля в библиотеку в CMake - PullRequest
0 голосов
/ 24 мая 2018

В 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 Ответ

0 голосов
/ 28 мая 2018

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

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

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

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

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

Ссылки

...