2010-05-17 3 views
1

Недавно я начал настраивать свою собственную библиотеку и проекты с использованием системы кросс-платформенной сборки (генерирует файлы make, визуальные студийные решения/проекты и т. Д. По запросу), и я столкнулся с проблемой, которая, вероятно, была уже решена.Система сборки с агрегированием рекурсивных зависимостей

Проблема, с которой я столкнулся, заключается в следующем: когда приложение имеет зависимость, которая также имеет зависимости, тогда связанное приложение должно связывать зависимость, а также все ее подзависимости. Это происходит рекурсивным способом, например,

(Для аргументов ради давайте предположим, что мы имеем дело исключительно со статическими библиотеками.)

  • TopLevelApp.exe
    • dependency_A
      • dependency_A-1
      • dependency_A-2
    • dependency_B
      • dependency_B-1
      • dependency_B-2

Таким образом, в этом примере TopLevelApp нужно будет связать dependency_A, dependency_A-1, dependency_A-2 и т.д., и то же самое для Б. Я считаю, что ответственность за запоминание всех этих вручную в целевом приложении довольно суба оптимальна. Также существует проблема обеспечения одинаковой версии зависимости для всех целей (предполагая, что некоторые цели зависят от одних и тех же вещей, например, boost).

Теперь требуется связывание всех библиотек, и нет возможности обойти его. То, что я ищу, - это система сборки, которая управляет этим для вас. Таким образом, все, что вам нужно сделать, это указать, что вы зависите от чего-то, и соответствующие зависимости этой библиотеки будут автоматически вставляться.

Система сборки, на которую я смотрел, - это premake4, которая не справляется с этим (насколько я могу судить). Кто-нибудь знает о системе сборки, которая справляется с этим? и если нет, то почему нет?

+0

так выглядит, как cmake выполнит эту работу, знает ли кто-нибудь о других? Скуны, automake? – radman

+0

вы можете добиться этого с помощью automake через pkg-config. –

+0

спасибо Майкл, я думаю, что о всей необходимой мне информации. Похоже, я буду перемещать свои усилия по созданию cmake :) – radman

ответ

1

Типичный способ, которым это обрабатывается, заключается в том, что библиотека, на которой вы зависите, говорит вам, что она, в свою очередь, требует и с какими версиями она связана. Один из способов сделать это - pkg-config. Например, если вы вызываете pkg-config name_of_package -cflags, он распечатает необходимые флаги, которые должны включать флаги, необходимые для добавления заголовков косвенных зависимостей. Аналогично, pkg-config name_of_package -ldflags будет печатать необходимые флаги компоновщика, которые включают эту конкретную библиотеку, а также ее зависимости. Что касается системы сборки, то я бы рекомендовал использовать CMake. В CMake зависимости найдены путем вызова FIND_PACKAGE (name_of_package), который, в свою очередь, определяет переменную name_of_package_FOUND как 1, если пакет был найден, а также - если он был найден - определяет имена__файлов_LIBRARIES и name_of_package_INCLUDE_DIRS для библиотек и путей заголовков для этого пакета, а также для библиотек и заголовков его зависимостей. Тем не менее, механизм FIND_PACKAGE работает через подключаемые модули, написанные третьими сторонами, и поэтому, хотя система должна устанавливать переменные _LIBRARIES и _INCLUDE_DIRS, так что зависимости зависимостей включаются рекурсивно, не все модули делают это правильно в последний раз, когда я проверил.