Maven-ähnliches Abhängigkeitsmanagement für C ++? [geschlossen]


94

Angenommen, ich habe ein C ++ - Projekt, das in mehrere Teilprojekte aufgeteilt ist. Das Teilprojekt erzeugt alle eine DLL, und verschiedene Entwicklerteams arbeiten an jedem Teilprojekt. Wenn ich nun das Hauptprojekt erstellen möchte, gibt es eine Möglichkeit, zu vermeiden, dass alle Teilprojekte selbst erstellt werden müssen?

Kurz gesagt, ich suche nach etwas, das das Abhängigkeitsmanagement (dh für Binärdateien und Header) auf ähnliche Weise wie Maven für Java ausführt.

Tatsächlich habe ich versucht, Maven dafür zu verwenden, aber das ist ziemlich umständlich, da ich die Pakete manuell und ziemlich häufig erstellen muss. Maven vermisst es, die letzten Änderungen zu übernehmen. Außerdem ist das Ausführen der Kompilierung ein kleiner Hack, da ich NAnt in Maven aufrufen muss (ich verwende die Funktion von NAnt, um Visual Studio-Lösungen direkt zu erstellen).

Irgendwelche Hinweise und Ideen dazu?


Das Problem bei der Verwendung von make ist, dass ich alles mindestens einmal erstellen muss und daher auch die Quelldateien für die Abhängigkeiten benötige. Insbesondere beim Wiederherstellen abhängiger Bibliotheken kann dies sehr zeitaufwändig sein und die Produktivität erheblich beeinträchtigen. Oder fehlt mir etwas?
Weberste

3
Dies scheint eine nützliche Frage zu sein. Vielleicht kann diese Frage auf eine andere Site portiert werden, die diese Fragen besser beantwortet? Ich suche nach Best Practices für das C ++ - Abhängigkeitsmanagement.
Simgineer

Dies ist ungefähr 10 Jahre zu spät, daher gibt es hier drei Möglichkeiten: Sie missbrauchen maven, Sie verpassen den ganzen Punkt mavenoder vor 10 Jahren, als ich nicht mavenfür C ++ verwendet habe, war es für C ++ weitaus weniger nützlich. Ich kann nicht für 2009 sprechen, aber in den letzten Jahren aus Erfahrung mavenwürden Sie genau das für das Problem verwenden, das Sie beschreiben. Es macht genau das, was Sie wollen, und das ziemlich effizient und gut, und es macht nicht die negativen Dinge, von denen Sie behaupten, dass es sie tut. Wer dies 2019 oder später liest, sollte nachdrücklich in Betracht ziehen, es mavenfür diesen Zweck zu verwenden.
Searchengine27

Antworten:


37

Erste Antwort : Ich würde die Verwendung von CMake vorschlagen. Es handelt sich um einen plattformübergreifenden Generator für Make-Dateien (generiert auch Visual Studio- oder Eclipse-CDT-Projekte).

http://www.cmake.org/

Ich habe wirklich gute Erfahrungen damit gemacht. Das Beste, was mir daran gefällt, war die Fähigkeit, eine generische Projektstruktur zu erstellen. So können Sie generisch die Suche nach Unterprojekten für Komponententests usw. einschließen, ohne das Skript jedes Mal zu ändern.

Sie haben auch viele Module zum Auffinden vorinstallierter Build-Bibliotheken, die für das Projekt erforderlich sind (wie Boost, QT usw.).


Update : In der Zwischenzeit gab es einige Anstrengungen, um die Paketverwaltung für C ++ einzuführen. Einige sehenswerte Projekte:

  • conan.io lässt sich in wichtige Build-Tools integrieren:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm basierend auf CMake ( Hinweis CPM wird nicht aktiv gepflegt.)
  • Buckaroo

Beachten Sie, wie von @RAM in den Kommentaren hervorgehoben, dass cpm nicht mehr aktiv gepflegt wird.


7
Ich habe CMake vor ein paar Monaten verwendet und tatsächlich hat die Suche nach vorinstallierten Bibliotheken sehr gut funktioniert. Andere binäre Abhängigkeiten (dh diejenigen, die aus meinen Teilprojekten stammen) konnten jedoch nicht einfach verwaltet werden. Vermisse ich etwas
Weberste

3
@weberste, Eigentlich gibt es kein Maven-ähnliches Tool für C / C ++. Entwickler versuchen, das Abhängigkeitsmanagement mit einem apt-get-ähnlichen Tool zu handhaben.
SunnyShah

1
cpm wird nicht aktiv gewartet und ist seit Anfang 2015 tot.
RAM

@ Ram: Danke, dass du darauf hingewiesen hast. Ich habe dem Beitrag eine Notiz mit Bezug auf Sie hinzugefügt.
Ovanes

2
CMake ist ein Build-System mit eingeschränkter Fähigkeit, Abhängigkeiten zu finden. Es ist kein Abhängigkeitsmanager im Sinne von NPM, Fracht usw.
sdgfsdh

17

Für das Abhängigkeitsmanagement gibt es ein neues Projekt (es ist ein Startup-Unternehmen), das diese Art von Tool implementiert: https://github.com/biicode (ein C ++ - Abhängigkeitsmanager). Sie könnten Ihre Abhängigkeiten hinzufügen und es sollte funktionieren.

Derzeit heißt das Projekt conan.io , sie wurden von JFrog übernommen .

UPDATE: Das Projekt ist tot ... Leider scheint es, dass das Startup nicht genug Premium-zahlende Kunden bekommen konnte, aber der Server scheint gut zu funktionieren ...

UPDATE2: Es scheint, dass es ein Ersatzprojekt gibt: conan.io (danke @mucaho)


Ich kann den Link entfernen .. das Projekt wurde geschlossen, jetzt ist es conan.io
carlos.baez

Danke für das Update! Ich schaue meistens nur aus Neugier, es sieht so aus, als ob es immer noch möglich ist, in ihrem Github nach der Dokumentation zu suchen . Es ist wahrscheinlich nicht so schön wie das, was irgendwann auf der Website war, aber ich denke, es ist besser als nichts. Ich frage mich nur, ist conan.io nur ein Rebranding oder ein völlig anderes Produkt?
JRH

1
Kein Rebranding, sondern ein völlig neues Projekt von Grund auf mit all den gewonnenen Erkenntnissen: vollständig Open Source, vollständig dezentralisiert mit einem internen Server, unterstützt alle Build-Systeme und verwaltet Binärdateien.
Drodri

8

Ich empfehle die folgenden High-Level-Build-Systeme:


Maven Nar Plugin bekommt gute Unterstützung. Ich habe es benutzt und ich mag es bisher. Sie müssen jedoch verstehen, dass Maven nicht gut für ein Mono-Repo ist. Die meisten C ++ - Lösungen benötigen ein Mono-Repo-Handle für Freigabebibliotheken und dergleichen.
Hans

5

Wenn Sie nur das Abhängigkeitsmanagement wünschen, versuchen Sie es mit Ivy , es lässt sich gut in Ant integrieren (und ich gehe davon aus, dass NAnt dasselbe auf der Grundlage dieses Blogs tun kann , das von der Ivy-Site verlinkt ist).

Es gibt auch Byldan , eine .NET-Version von Maven. Ich weiß nicht, wie gut das für Sie funktionieren wird.


3

Make und GCC sind eine großartige Kombination für eine wirklich gute Abhängigkeitsprüfung.

GCC kann automatisch 'make'-Abhängigkeitsdateien generieren (-MD-Befehlszeilenschalter), um beispielsweise alle Quelldateien neu erstellen zu können, die von einem bestimmten Header abhängen.

Ich habe einige einfache Regeln, die ich in meine Makefiles ausschneide und einfüge:

# 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 $@

Wenn Ihre Objektdateien beispielsweise in einer OBJ_C- und einer OBJ_CPP-Liste deklariert sind:

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

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

Make kann natürlich Abhängigkeiten von anderen Projekten und dergleichen verfolgen, z. B. bei Bedarf auch eine gemeinsame Bibliothek neu erstellen.

Wenn Ihre anderen Teams beispielsweise ihre neuesten DLLs immer in einem freigegebenen Ordner ablegen:

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

Siehe meinen Kommentar an die Frage bezüglich meiner Bedenken bezüglich dieser Lösung
weberste

Wenn ein Ziel von einer anderen Datei abhängig ist, z. B. Ihre ausführbare Datei von einer gemeinsam genutzten Bibliothek abhängig ist, können Sie eine Regel für diese gemeinsam genutzte Bibliothek festlegen, die sicherstellt, dass Ihre Kopie der Bibliothek auf dem neuesten Stand ist, ohne dass die Quelle benötigt wird, z. B. durch einfaches Abrufen die neueste Kopie von einem bestimmten Speicherort oder von der Ausführung eines Versionskontrollupdates oder dergleichen.
Will

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Es fiel mir schwer, all diese Make-Symbole zu analysieren. Es sieht so aus, als würde dies in etwa so aufgelöst, als g++ -c main.cc -MD -MF testob Sie es eigenständig über die Befehlszeile ausführen möchten, und die Ergebnisse werden in einer Datei mit dem Namen "test" abgelegt.
JRH

2

Ich empfehle Conan , das ich in diesen Tagen verwendet habe. Es ist sehr leistungsfähig, alle abhängigen Bibliotheken und Binärdateien in Ihrem Projekt zu verwalten.



1

Sie können ein NuGet-Paket für verwendete Bibliotheken erstellen und NuGet für das Abhängigkeitsmanagement verwenden.

Siehe auch NuGet für C ++


1
NuGet ist eine Visual Studio-Erweiterung
Toughy

@Toughy, es kann auch als eigenständiges Abhängigkeitsmanagement verwendet werden. (4M ausführbare Datei)
Yousha Aleayoub

0

Auf SCons befinden sich eine Reihe von Tools, die ähnliche Funktionen wie Autotools auf höherer Ebene bieten und den Entwicklern das Leben erleichtern sollen (z. B. WAF, SNOCS). Leider hat SCons selbst den Hauptnachteil - längere Kompilierungszeit für die großen Projekte.

Ich kann empfehlen, SNOCS (ein umgekehrter SCons) für diejenigen unter Ihnen auszuprobieren, die ein einfaches Abhängigkeitsmanagement suchen und Kompilierungsoptionen im einzelnen Befehl auswählen möchten (Compiler, x86 / x64, Debug / Release, statische / gemeinsam genutzte Bibliotheken, Test / Ziele installieren usw.).

SNOCS versucht auch, das Problem der langen Kompilierungszeit zu lösen, indem die Projektkonfigurationsausgabe in den separaten Dateien gespeichert wird. Dadurch können die nachfolgenden Builds die Konfigurationsphase insgesamt überspringen und direkt zur Bauphase übergehen (die letzte Funktion befindet sich derzeit im Aufbau).

Die Konfiguration von CMake wird in größeren Lösungen mühsam, sodass die Wartung des Build-Systems einen großen Teil der Entwicklerzeit in Anspruch nimmt. Glücklicherweise gibt es, wie Martijn bereits erwähnte, einen Biicode, der "CMake verwendet, um Ihr Projekt mit seinen Abhängigkeiten zu generieren".


-1

Versuchen Sie SCons

SCons ist ein Open Source-Software-Konstruktionstool, dh ein Build-Tool der nächsten Generation. Stellen Sie sich SCons als verbesserten, plattformübergreifenden Ersatz für das klassische Make-Dienstprogramm mit integrierten Funktionen vor, die Autoconf / Automake- und Compiler-Caches wie Ccache ähneln. Kurz gesagt, SCons ist eine einfachere, zuverlässigere und schnellere Möglichkeit, Software zu erstellen.


3
SCons hat kein eingebautes Abhängigkeitsmanagement oder Repository wie gefragt.
Maxime Viargues

-3

Ich empfehle, die Mutter aller Build-Abhängigkeitssysteme zu verwenden: make.


Ich benutze dies ausgiebig. GCC kann Abhängigkeitsdateien erstellen, die 'make' essen kann. Genug für eine andere Antwort, vielleicht ...
Will

8
machen ist eigentlich das, was jeder vermeiden / ersetzen möchte, indem er sich Build-Automatisierungssysteme ansieht
Chila

-6

Versuchen Sie Scons, Sie werden süchtig. Make ist veraltet, schwierig und teuer zu warten.


Ich habe mir Scons angesehen, aber keine Möglichkeit gefunden, binäre Abhängigkeiten zu verwalten. Haben Sie ein Beispiel dafür?
Weberste

1
Da Scons Python ist, können Sie ganz einfach codieren, was Sie möchten, um Ihre binären Abhängigkeiten zu verwalten. Vielleicht hilft es auch, ein "SConscript" im Verzeichnis Ihrer binären Abhängigkeiten zu haben. Ich bin mir nicht sicher, was Ihre Anforderungen hier hart sind. Pedro.
Piotr

16
Sie schlagen also ein Tool vor, das auf "Ich bin nicht sicher, was Sie brauchen, aber Sie können es selbst in Python programmieren" basiert. Warum brauchst du dann Scons?
Jalf
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.