В 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?
0
E. Vakili 24 Май 2018 в 18:14

1 ответ

Лучший ответ

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

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

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

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

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

Ссылки

1
Florian 28 Май 2018 в 10:24