Как добавить зависимость только для компиляции с помощью cmake - PullRequest
0 голосов
/ 04 марта 2019

Мне нужно добавить зависимость только для компиляции от внешней библиотеки my в файле CMake, которая в дальнейшем упоминается как the_lib.Говоря о зависимости только от компиляции, я имею в виду распространение свойств времени компиляции, наиболее важно -I правила.

Рассматриваемая библиотека создается как цель библиотеки с использованием add_library.Обычно я просто использовал бы target_link_libraries(my_exec the_lib), но при этом добавляются свойства как времени компиляции, так и времени компоновки, т. Е. Добавляются правила -I и -l/-L к командам компиляции, в то время как мне нужен только -I.(Если кому-то интересно, почему мне нужна такая настройка, это , потому что причины .)

Обратите внимание, target_include_directories с чем-то вроде ${the_lib_SOURCE_DIR} (или чем-то похожим на этот эффект)не будет работать для меня, потому что он не будет добавлять каталоги, необходимые для lib.Мне нужно что-то вроде ${the_lib_INCLUDE_DIRS}, где the_lib_INCLUDE_DIRS будет заполнено как -I правила, требуемые the_lib - но я не нашел ни одной переменной, которая бы соответствовала этому.

Стоит отметить, что яне может (или не может) изменять the_lib.

1 Ответ

0 голосов
/ 04 марта 2019

Мне нужно добавить зависимость только для компиляции во внешнюю библиотеку в файле CMake

Под "внешней" библиотекой я понимаю, что вы не имеете в видутот же проект - т.е. тот, который не настроен в рамках той же системы сборки CMake, что и цель, которую вы пытаетесь построить.

[...] Обычнозависимости добавляются с помощью target_link_libraries(my_exec the_lib), но это добавляет зависимость как во время компиляции, так и во время компоновки.

Ну нет, не обязательно.Как говорится в олове, это добавляет зависимость ссылки, которую вы можете рассматривать как параметр -l.Насколько мне известно, он не генерирует никаких -I опций для внешних библиотек или иным образом влияет на этап компиляции в отношении внешних библиотек.Точно так же, насколько мне известно, он распространяет транзитивные зависимости любого рода, только когда добавленная библиотека является другой целью, сконфигурированной и построенной той же системой сборки.То есть только для внутренних библиотек, а не для внешних.

Обратите внимание, target_include_directories с чем-то вроде ${the_lib_SOURCE_DIR} (или чем-то похожим на этот эффект) не будет работать для меня, потому что это не будетдобавить каталоги, необходимые для lib.Мне нужно что-то вроде ${the_lib_INCLUDE_DIRS}, где the_lib_INCLUDE_DIRS будет заполнено до -I правил, требуемых the_lib - но я не нашел ни одной переменной, которая бы соответствовала этому.

Я думаювы запрашиваете каталоги включения, которые были бы необходимы для успешного использования заголовков the_lib, в ситуации, когда эти заголовки имеют свои собственные внешние зависимости.Существует причина, по которой вы не находите подходящую для этого переменную: не существует согласованного или стандартного способа получения этой информации для внешних библиотек.Доступные методы зависят от the_lib.Они будут включать некоторые , но, вероятно, не все, из следующих:

  • Используйте макрос CMake, предоставляемый с the_lib или с самим CMake, чтобы определитьпеременная CMake, передающая требуемую информацию.
  • Используйте pkg-config, чтобы прочитать информацию из записи pkg-config, связанной с the_lib.
  • .строка Python python-config.
  • . Анализируйте заголовки the_lib, чтобы определить внешние пакеты, от которых они зависят, и выполняйте явный поиск по отдельности для заголовков этих пакетов.
  • Требуется пользовательуказать вручную для любых необходимых пакетов, которые не включены в путь по умолчанию.

В CMake нет магической переменной или функции для автоматического сбора такой информации, потому что, вообще говоря, она недоступна из *Сами заголовки 1056 *.Также обратите внимание, что большинство из них будут зависеть от включенных the_lib зависимостей, устанавливаемых в определенных местах, ожидаемых во время сборки the_lib.Это довольно сложно обеспечить.

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