Как использовать заголовки из библиотеки, но не ссылаться на нее с CMake? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть исполняемый файл и динамическая c библиотека, которые оба зависят от stati c libary. Если помогает больше контекста, исполняемый файл встраивает интерпретатор Python, а библиотека dynamici c является модулем расширения Python. Библиотека dynamici c не должна ссылаться на библиотеку stati c, поскольку последняя уже связана исполняемым файлом. Однако для динамической библиотеки c требуются заголовки из библиотеки stati c для компиляции, которая неявно предоставляется только через target_link_libraries. По сути, мне нужен target_link_libraries, который добавляет пути включения и больше ничего не делает.

Вот что я пробовал:

  • Извлечение каталогов включения из Свойство target библиотеки stati c, но косвенно включенные заголовки по-прежнему отсутствуют.

  • Иметь исполняемый файл и библиотеку dynamici c оба связаны с библиотекой stati c. Нельзя ожидать, что это сработает, и это не так.

  • Превратите библиотеку stati c в динамическую c библиотеку. Это бы сработало, но я бы хотел как можно больше не трогать сценарии сборки для библиотеки stati c и исполняемого файла.

  • Сделать динамическую c библиотеку stati c и связывает его с исполняемым файлом. Это невозможно, потому что Python расширения должны быть загружены динамически.

Ответы [ 3 ]

1 голос
/ 17 апреля 2020

Обычно find_package(Foo) определяет включаемые каталоги пакетов в переменной FOO_INCLUDE_DIR.

Вы можете просто добавить это к пути включения вашего проекта с помощью

include_directories("${FOO_INCLUDE_DIR}")
0 голосов
/ 23 апреля 2020

Генераторное выражение $<TARGET_PROPERTY> делает свое дело.

target_include_directories(
    MyDynamicLib
    PRIVATE
    $<TARGET_PROPERTY:MyStaticLib,INCLUDE_DIRECTORIES>)

get_target_property оценивается на этапе конфигурации и возвращает то, что записано в CMakeLists.txt. Выражение генератора $<TARGET_PROPERTY> вычисляется на этапе генерации и возвращает фактическое значение.

0 голосов
/ 20 апреля 2020

Вам понадобится отдельная цель, которая предоставляет только заголовки.

И библиотека stati c, и библиотека dynamici c будут зависеть от этой цели только для заголовка, но не друг от друга.

Обычно это достигается определением цели библиотеки интерфейса для заголовков:

target_include_directories(MyHeaders INTERFACE
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>
)

add_library(MyStaticLib STATIC a.cpp)
target_link_libraries(MyStaticLib PUBLIC MyHeaders)
add_library(MyDynamicLib SHARED b.cpp)
target_link_libraries(MySDynamicLib PUBLIC MyHeaders)

Обратите внимание, как для этого вам понадобится полный контроль над определением все цели библиотеки. Если библиотека stati c предоставляется сторонней сборкой, которая не находится под вашим контролем, это не будет работать. В этом случае вам следует связаться с сопровождающим сторонней библиотеки, чтобы выяснить, как они могут поддержать ваш вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...