Управление зависимостями в стиле Maven для C ++? [закрыто]


95

Скажем, у меня есть проект C ++, который разделен на несколько подпроектов. Все подпроекты создают DLL, и над каждым подпроектом работают разные группы разработчиков. Теперь, если я хочу построить основной проект, есть ли способ избежать создания всех подпроектов самостоятельно?

Короче говоря, я ищу что-то, что управляет зависимостями (то есть для двоичных файлов и заголовков) так же, как Maven для Java.

Фактически, я пытался использовать для этого Maven, но это довольно обременительно, потому что мне приходится создавать пакеты вручную, и довольно часто Maven пропускает самые последние изменения. Кроме того, запуск компиляции - это своего рода взлом, поскольку мне нужно вызывать NAnt из Maven (я использую функцию NAnt для непосредственного создания решений Visual Studio).

Любые подсказки и идеи, как это сделать?


Проблема при использовании make заключается в том, что мне нужно собрать все по крайней мере один раз, и поэтому мне также нужны исходные файлы для зависимостей. В частности, при перестройке зависимых библиотек это может занять очень много времени и серьезно повлиять на производительность. Или я что-то упускаю?
— weberste

4
Это кажется полезным вопросом. Может быть, этот вопрос можно перенести на другой сайт, который более приветствует эти вопросы? Я ищу лучшие практики для управления зависимостями C ++.
— simgineer

Это примерно на 10 лет позже, так что здесь есть 3 возможности: вы неправильно используете maven, вы упускаете всю суть maven, или 10 лет назад, когда я не использовал mavenдля C ++, это было гораздо менее полезно для C ++. Я не могу говорить о 2009 году, но по опыту последних лет mavenэто именно то, что вы бы использовали для решения описываемой вами проблемы. Он делает именно то, что вы хотите, довольно эффективно и хорошо, и не делает того негативного, о котором вы заявляете. Любой, кто читает это в 2019 году или позже, должен серьезно подумать об использовании mavenдля этой цели.
— searchchengine27

Ответы:


37

Первоначальный ответ : я бы предложил использовать CMake. Это многоплатформенный генератор файлов make (также генерирует проекты Visual Studio или Eclipse CDT).

http://www.cmake.org/

У меня был действительно хороший опыт. Больше всего мне в нем нравится возможность создавать общую структуру проекта. Таким образом, вы можете в общем случае включить поиск подпроектов для модульных тестов и т. Д., Не меняя каждый раз сценарий.

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


Обновление : Тем временем были предприняты некоторые усилия по внедрению управления пакетами для C ++. Некоторые проекты, на которые стоит обратить внимание:

  • conan.io интегрируется с основными инструментами сборки:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm на основе CMake ( обратите внимание, что цена за тысячу показов не поддерживается активно).
  • Buckaroo

Обратите внимание, как указывает @RAM в комментариях, cpm больше не поддерживается активно.


7
Я использовал CMake несколько месяцев назад, и действительно, проверка предустановленных библиотек работала очень хорошо. Однако другими бинарными зависимостями (т. Е. Исходящими из моих подпроектов) было нелегко управлять. Я что-то упускаю?
— weberste

3
@weberste, на самом деле maven like tool для C / C ++ нет. Разработчики пытаются справиться с управлением зависимостями с помощью инструмента apt-get like.
— SunnyShah

1
cpm активно не поддерживается и не работает с начала 2015 года.
— RAM

@RAM: спасибо, что указали на это. Я добавил в пост примечание о вас.
— ovanes 04

2
CMake - это система сборки с ограниченной возможностью поиска зависимостей. Это не менеджер зависимостей в смысле NPM, Cargo и т. Д.
— sdgfsdh 01

17

Для управления зависимостями существует новый проект (это стартап), который реализует этот тип инструмента: https://github.com/biicode (менеджер зависимостей C ++). Вы можете добавить свои зависимости, и он должен работать.

В настоящее время проект носит название conan.io , он был приобретен JFrog .

ОБНОВЛЕНИЕ: проект мертв ... К сожалению, похоже, что стартап не смог получить достаточно клиентов, платящих премию, но сервер, похоже, работает нормально ...

ОБНОВЛЕНИЕ 2: похоже, есть заменяющий проект: conan.io (спасибо @mucaho)


Могу удалить ссылку .. проект закрыли, теперь он conan.io
— carlos.baez

Спасибо за обновления! Я в основном просто смотрю из любопытства, похоже, все еще можно покопаться в их github в поисках документации ; возможно, это не так хорошо, как то, что было на сайте в какой-то момент, но я думаю, это лучше, чем ничего. Просто интересно, conan.io - это всего лишь ребрендинг или это совершенно другой продукт?
— младший

1
Не ребрендинг, а совершенно новый проект с нуля со всеми извлеченными уроками: полностью открытый исходный код, полностью децентрализованный с внутренним сервером, поддерживает все системы сборки, управляет двоичными файлами.
— drodri

8

Я рекомендую следующие системы сборки высокого уровня:


Плагин Maven Nar получает хорошую поддержку. Я пользовался им и пока нравится. Однако вам нужно понимать, что Maven не подходит для моно-репо. Большинству решений C ++ требуются библиотеки общего доступа репозитория Mono и тому подобное.
— Ганс

5

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

Существует также Byldan , версия Maven .Net. Не знаю, насколько хорошо это сработает для вас.


3

Make и GCC - отличная комбинация для действительно хорошей проверки зависимостей.

GCC может автоматически генерировать файлы зависимостей make (ключ командной строки -MD), чтобы иметь возможность, например, перестроить все исходные файлы, которые зависят от данного заголовка.

У меня есть несколько простых правил, которые я вставляю в свои make-файлы:

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

Теперь, если ваши объектные файлы объявлены, скажем, в списках OBJ_C и OBJ_CPP:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

Конечно, make может отслеживать зависимости с другими проектами и тому подобным, например, при необходимости, перестраивать совместно используемую библиотеку.

Например, если другие ваши команды всегда помещают свои последние библиотеки DLL в какую-либо общую папку:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib

см. мой комментарий к вопросу о моих опасениях по поводу этого решения
— weberste

Если цель зависит от другого файла, например, ваш исполняемый файл зависит от общей библиотеки, у вас может быть правило для этой разделяемой библиотеки, которое гарантирует, что ваша копия библиотеки актуальна без необходимости в источнике, например, путем простого извлечения последняя копия из определенного места или при выполнении какого-либо обновления системы контроля версий или чего-то подобного.
— Will

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Мне было трудно разобрать все эти символы Make, похоже, это разрешает что-то вроде того, g++ -c main.cc -MD -MF testесли вы хотите запустить его автономно в командной строке, и он помещает результаты в файл с именем 'test'.
— jrh


2

Я рекомендую Conan , который я использовал в эти дни. Это очень мощный инструмент для поддержки всех зависимых библиотек и двоичных файлов в вашем проекте.


1

Вы можете создать пакет NuGet для используемых библиотек и использовать NuGet для управления зависимостями.

См. Также NuGet для C ++


1
NuGet - это расширение Visual Studio
— Toughy

@Toughy, его также можно использовать как автономное управление зависимостями. (Исполняемый файл
— размером

0

Существует ряд инструментов, расположенных поверх SCons, обеспечивающих функциональность более высокого уровня, аналогичную Autotools, которая пытается облегчить жизнь разработчикам (например, WAF, SNOCS). К сожалению, у самого SCons есть главный недостаток - большее время компиляции для больших проектов.

Я могу порекомендовать попробовать SNOCS (который является перевернутым SCons) для тех из вас, кто ищет простое управление зависимостями и выбирает параметры компиляции в одной команде (компилятор, x86 / x64, Debug / Release, статические / общие библиотеки, test / установить мишени и т. д.).

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

Конфигурация CMake становится утомительной в более крупных решениях, поэтому обслуживание системы сборки занимает значительную часть времени разработчика. К счастью, как уже упоминал Мартин, существует biicode, который «использует CMake для создания вашего проекта с его зависимостями».


-1

Попробуйте SCons

SCons - это инструмент для создания программного обеспечения с открытым исходным кодом, то есть инструмент для сборки нового поколения. Считайте SCons улучшенной кроссплатформенной заменой классической утилиты Make со встроенной функциональностью, аналогичной autoconf / automake и кешам компилятора, таким как ccache. Короче говоря, SCons - это более простой, надежный и быстрый способ создания программного обеспечения.


3
SCons не имеет встроенного управления зависимостями или репозитория, как просили.
— Максим Виарг,

-4

Я рекомендую использовать мать всех систем зависимостей сборки: make.


Я широко этим пользуюсь. GCC может создавать файлы зависимостей, которые make может съесть. Возможно, для другого ответа хватит ...
— Уилл

8
make - это на самом деле то, чего все хотят избежать / заменить, глядя на build -automation- systems
— chila

-6

Попробуйте бра, вас зацепит. Марка устарела, сложна и дорога в обслуживании.


Я посмотрел на Scons, но не нашел способа управлять двоичными зависимостями. У вас есть для этого пример?
— weberste

1
Поскольку scons - это Python, вы можете легко кодировать все, что хотите, для управления своими двоичными зависимостями. Возможно, наличие «SConscript» в каталоге ваших двоичных зависимостей также поможет. Я не уверен, каковы ваши жесткие требования. Педро.
— piotr

16
Итак, вы предлагаете инструмент, основанный на том, что «я не уверен, что вам нужно, но вы можете сами запрограммировать его на Python». Зачем тогда вам бра?
— jalf
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.