Менеджене управління залежністю від C ++? [зачинено]


94

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

Коротше кажучи, я шукаю те, що керує залежністю (тобто для бінарних файлів та заголовків) аналогічно тому, як Maven робить для Java.

Насправді я намагався використовувати Maven для цього, але це досить громіздко, оскільки мені доводиться створювати пакунки вручну і досить часто, Maven не вистачає, щоб забрати останні зміни. Крім того, запуск компіляції - це трохи хак, тому що я повинен викликати NAnt зсередини Maven (я використовую функцію NAnt безпосередньо для створення рішень Visual Studio).

Будь-які підказки та ідеї, як це зробити?


Проблема при використанні make полягає в тому, що я повинен будувати все хоча б один раз, а тому мені також потрібні вихідні файли для залежності. Тим більше, що при перебудові залежних бібліотек це може зайняти багато часу та значно вплинути на продуктивність. Або мені чогось не вистачає?
weberste

3
Це здається корисним питанням. Можливо, це питання можна перенести на інший сайт, який привабливіший до цих питань? Я шукаю найкращі практики для управління залежностями c ++.
simgineer

Це запізнюється на 10 років, тому є три можливості тут: ви неправильно використовуєте maven, ви пропускаєте цілий пункт maven, або 10 років тому, коли я не використовував mavenдля C ++, це було набагато менш корисно для C ++. Я не можу говорити за 2009 рік, але в останні роки з досвіду - mavenце саме те, що ви використаєте для проблеми, яку описуєте. Це робить саме те, що ви хочете, і досить ефективно і добре, і не робить негативних речей, на які ви стверджуєте, що це робить. Кожен, хто читає це в 2019 році або пізніше, повинен рішуче розглянути можливість використання mavenдля цього.
searchengine27

Відповіді:


37

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

http://www.cmake.org/

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

Вони також мають безліч модулів про те, як знайти заздалегідь встановлені бібліотеки збірки, необхідні для проекту (наприклад, Boost, QT тощо)


Оновлення : Тим часом були вкладені певні зусилля, щоб запровадити управління пакетами для C ++. Деякі проекти, які варто переглянути:

  • conan.io інтегрується з основними інструментами побудови:
    • CMake
    • Візуальна студія
    • Makefilefile
    • XCode
    • ...
  • cpm на основі CMake ( Примітка CPM не підтримується активно.)
  • Буккару

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


7
Я використовував CMake кілька місяців тому, і справді, перевірка наявності попередньо встановлених бібліотек працювала дуже добре. Однак іншими бінарними залежностями (тобто тими, що надходять з моїх підпроектів) не вдалося легко керувати. Я щось пропускаю?
weberste

3
@weberste, Насправді для C / C ++ не існує подібного інструменту Maven. Розробники намагаються впоратися з керуванням залежністю інструментом apt-get like.
SunnyShah

1
cpm не підтримується активно і загинув з початку 2015 року.
ОЗУ

@RAM: спасибі за вказівку на це. Я додав замітку у публікації з посиланням на вас.
ovanes

2
CMake - це система побудови з обмеженою здатністю знаходити залежності. Це не менеджер залежності у сенсі NPM, Cargo тощо.
sdgfsdh

17

Для управління залежностями існує новий проект (це стартап-компанія), який реалізує такий інструмент: https://github.com/biicode (менеджер залежності C ++). Ви можете додати свої залежності, і це має спрацювати.

Наразі назва проекту - conan.io , їх придбав JFrog .

ОНОВЛЕННЯ: Проект мертвий ... На жаль, здається, що стартап не міг отримати достатньо клієнтів, які платять преміум-класу, але сервер, здається, працює нормально ...

UPDATE2: Схоже, є проект-замінник: conan.io (спасибі @mucaho)


Я можу видалити посилання .. проект закрили, зараз це conan.io
carlos.baez

Дякуємо за оновлення! Я здебільшого просто дивлюся з цікавості, схоже, що все-таки можна зазирнути на їхній github для документації ; це, мабуть, не так приємно, як те, що було на веб-сайті в один момент, але я думаю, це краще, ніж нічого. Цікаво, чи є conan.io лише ребрендом чи це зовсім інший продукт?
jrh

1
Не ребрендинг, а абсолютно новий проект з нуля з усіма засвоєними уроками: повністю відкритий код, повністю децентралізований з власним сервером, підтримує всі системи побудови, керує бінарними файлами.
drodri

8

Я рекомендую такі системи високого рівня складання:


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

5

Якщо ви хочете лише керувати залежністю, спробуйте Ivy , він непогано інтегрується з Ant (і я припускаю, що NAnt може зробити те саме на основі цього блогу , який пов’язаний із сайтом Ivy).

Існує також Билдан , .Net версія Maven. Не знаю, наскільки добре це буде працювати для вас.


3

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

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

У мене є кілька простих правил, які я вирізав-вклеював у свої файли:

# 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)

Звичайно, можна також відстежувати залежності з іншими проектами, наприклад, наприклад, будувати спільну бібліотеку, якщо це необхідно.

Наприклад, якщо ваші інші команди завжди розміщують свої останні 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

Якщо ціль залежить від іншого файлу, наприклад, ваш виконуваний файл залежить від спільної бібліотеки, ви можете встановити правило для цієї спільної бібліотеки, яка гарантує, що ваша копія бібліотеки буде оновлена, не потребуючи джерела, наприклад, просто добираючи останню копію з певного місця або з виконання якогось оновлення контролю версій чи іншого.
Буде

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


2

Я рекомендую конан , яким я користувався в ці дні. Це дуже потужно підтримувати всі залежні бібліотеки та бінарні файли у вашому проекті.


1

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

Дивіться також, NuGet для C ++


1
NuGet - це розширення Visual Studio
Toughy

@Toughy, він також може бути використаний як автономне управління залежностями. (
Виконавчий

0

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

Я можу порекомендувати спробувати SNOCS (це SCONS) для тих, хто шукає просте управління залежностями та вибирає параметри компіляції в одній команді (компілятор, x86 / x64, налагодження / випуск, статичні / спільні бібліотеки, тест / встановити цілі тощо).

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

Конфігурація CMake стає виснажливою у великих рішеннях, тому технічне обслуговування системи займає значну частину часу розробника. На щастя, як уже згадувався Мартійн, є бікод, який "використовує CMake для генерування вашого проекту з його залежностями".


-1

Спробуйте SCons

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


3
SCON не має вбудованого управління залежністю або сховища, як запитували.
Максим Віарг

-3

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


Я цим широко користуюся. GCC може створювати файли залежності, які 'make' може їсти. Досить для іншої відповіді, можливо ...
Чи буде

8
make - це насправді те, що всі хочуть уникнути / замінити, подивившись на системи
build -automation-

-6

Спробуйте сконс, вас зачеплять. Зробити застарілим, важким і дорогим в обслуговуванні.


Я подивився на Сконс, але не знайшов способу управління бінарними залежностями. У вас є приклад для цього?
weberste

1
Оскільки scons є python, ви можете легко кодувати все, що хочете, щоб керувати своїми бінарними залежностями. Можливо, наявність "SConscript" у каталозі ваших бінарних залежностей також допомагає. Я не впевнений, які ваші вимоги тут жорсткі. Педро.
piotr

16
Отже, ви пропонуєте інструмент на основі "Я не впевнений, що вам потрібно, але ви можете запрограмувати його самостійно в Python". Навіщо тобі тоді потрібні очки?
jalf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.