it-swarm.com.de

Maven-ähnliche Abhängigkeitsverwaltung für C++?

Angenommen, ich habe ein C++ - Projekt, das in mehrere Unterprojekte aufgeteilt ist. Alle Unterprojekte erzeugen 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 ich alle Unterprojekte selbst erstellen muss?

Kurz gesagt, ich suche nach etwas, das das Abhängigkeitsmanagement (d. H. Für Binärdateien und Header) auf eine ähnliche Weise erledigt wie Maven für Java.

In der Tat habe ich versucht, Maven dafür zu verwenden, aber das ist ziemlich umständlich, da ich die Pakete manuell erstellen muss. Maven versäumt es ziemlich oft, die letzten Änderungen zu übernehmen. Das Ausführen der Kompilierung ist ein bisschen hackend, da ich NAnt in Maven anrufen muss (ich verwende die Funktion von NAnt, um Visual Studio-Lösungen direkt zu erstellen).

Irgendwelche Tipps und Ideen, wie das geht?

77
weberste

Erste Antwort: Ich würde CMake vorschlagen. Es ist ein plattformübergreifender Make-File-Generator (erzeugt auch Visual Studio- oder Eclipse-CDT-Projekte).

http://www.cmake.org/

Ich habe wirklich gute Erfahrungen damit gemacht. Das Beste, was ich daran mag, war die Möglichkeit, generische Projektstrukturen zu erstellen. Sie können also generisch Teilprojekte nach Unit-Tests suchen usw., ohne das Skript jedes Mal ändern zu müssen.

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


Update: In der Zwischenzeit wurden einige Anstrengungen unternommen, um die Paketverwaltung für C++ einzuführen. Einige Projekte, die sich sehen lassen sollten:

  • conan.io integriert sich in die wichtigsten Build-Tools:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm basierend auf CMake
  • Buckaroo

Note, wie von @RAM in den Kommentaren angegeben, wird cpm nicht mehr aktiv verwaltet.

33
ovanes

Für das Abhängigkeitsmanagement gibt es ein neues Projekt (es ist ein Startup-Unternehmen), das diese Art von Werkzeug implementiert: https://www.biicode.com/ (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 erworben.

UPDATE: Das Projekt ist tot ... Leider scheint das Startup nicht genug Premium zahlende Kunden bekommen zu können, aber der Server scheint gut zu funktionieren ...

UPDATE2: Es scheint ein Ersatzprojekt zu geben: conan.io (Danke @mucaho)

15
carlos.baez

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

8
carlosvin

Wenn Sie nur Abhängigkeiten verwalten möchten, versuchen Sie Ivy , es ist gut in Ant integriert (und ich gehe davon aus, dass NAnt dasselbe auf diesem blog tun kann, das von der Ivy-Site verlinkt wird).

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

5
Rich Seller

Kürzlich veröffentlicht: biicode Ein Multiplattform-Tool und ein Hosting-Service für Entwickler

Bearbeiten:

Der Bicode ist veraltet

Alternative: Conan.io

3
Martijn Mellens

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

GCC kann 'Make'-Abhängigkeitsdateien automatisch generieren (-MD-Befehlszeilenoption), 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 einschneide:

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

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

Wenn nun Ihre Objektdateien 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 mit anderen Projekten verfolgen und z. Wiederaufbau einer gemeinsam genutzten Bibliothek bei Bedarf.

Wenn Ihre anderen Teams zum Beispiel ihre neuesten DLLs 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
3
Will

Ich empfehle conan , das ich heutzutage verwendet habe ... Es ist sehr mächtig, alle abhängigen Bibliotheken und Binaries in Ihrem Projekt zu verwalten.

2
Ben Chen

Sie können ein NuGet-Paket für die verwendeten Bibliotheken erstellen und NuGet für die Abhängigkeitsverwaltung verwenden.

Siehe auch NuGet für C++

1
KindDragon

Auf SCons gibt es eine Reihe von Tools, die eine höhere Funktionalität bieten, ähnlich der von Autotools, die den Entwicklern das Leben erleichtern sollen (z. B. WAF, SNOCS). Leider hat SCons selbst den größten Nachteil - längere Kompilierungszeit für große Projekte.

Ich kann empfehlen, SNOCS (das ist ein umgekehrtes SCons) für diejenigen von Ihnen auszuprobieren, die ein einfaches Abhängigkeitsmanagement suchen und im Einzelbefehl (Compiler, x86/x64, Debug/Release, static) Kompilierungsoptionen auswählen (gemeinsame Bibliotheken, Test-/Installationsziele usw.). 

SNOCS versucht auch, das Problem der langen Kompilierungszeit zu lösen, indem die Projektkonfigurationsausgabe in separaten Dateien gespeichert wird. Dadurch können die nachfolgenden Builds die Konfigurationsphase komplett überspringen und direkt in die Bauphase übergehen.

Die Konfiguration von CMake wird in größeren Lösungen mühsam, sodass die Wartung des Buildsystems einen großen Teil der Entwicklerzeit in Anspruch nimmt. Wie Martijn bereits erwähnt hat, gibt es biicode , der "CMake verwendet, um Ihr Projekt mit seinen Abhängigkeiten zu erzeugen".

0
oleg.blinnikov