Управление зависимостями в стиле 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.