103 votes

Gestion des dépendances de type Maven pour C++ ?

Disons que j'ai un projet C++ qui est divisé en plusieurs sous-projets. Les sous-projets produisent tous une DLL et différentes équipes de développeurs travaillent sur chacun des sous-projets. Maintenant, si je veux construire le projet principal, y a-t-il un moyen d'éviter de devoir construire tous les sous-projets par moi-même ?

En bref, je cherche quelque chose qui fasse la gestion des dépendances (c'est-à-dire pour les fichiers binaires et les en-têtes) d'une manière similaire à ce que fait Maven pour Java.

En fait, j'ai essayé d'utiliser Maven pour cela, mais c'est plutôt fastidieux car je dois créer les paquets manuellement et, assez fréquemment, Maven ne prend pas en compte les changements les plus récents. De plus, l'exécution de la compilation est un peu compliquée car je dois appeler NAnt à partir de Maven (j'utilise la fonctionnalité de NAnt pour construire directement des solutions Visual Studio).

Avez-vous des conseils et des idées sur la manière de procéder ?

0 votes

Le problème lorsque j'utilise make est que je dois tout construire au moins une fois et que j'ai donc également besoin des fichiers sources pour les dépendances. En particulier, lors de la reconstruction des bibliothèques dépendantes, cela peut prendre beaucoup de temps et affecter sévèrement la productivité. Ou est-ce que quelque chose m'échappe ?

5 votes

Cette question semble utile. Peut-être cette question peut-elle être transférée sur un autre site plus accueillant pour ces questions ? Je cherche les meilleures pratiques pour la gestion des dépendances en c++.

0 votes

C'est avec 10 ans de retard, il y a donc 3 possibilités : vous utilisez mal maven vous passez à côté de l'essentiel pour maven ou il y a 10 ans quand je n'utilisais pas maven pour le C++, il était beaucoup moins utile pour le C++. Je ne peux pas parler pour 2009, mais ces dernières années, par expérience, maven est exactement ce que vous utiliseriez pour le problème que vous décrivez. Il fait exactement ce que vous voulez, et assez efficacement et bien, et ne fait pas les choses négatives que vous prétendez qu'il fait. Toute personne lisant ceci en 2019 ou plus tard devrait fortement envisager d'utiliser maven à cette fin.

41voto

ovanes Points 1712

Réponse initiale : Je vous suggère d'utiliser CMake. Il s'agit d'un générateur de fichiers make multi-plateforme (qui génère également des projets Visual Studio ou Eclipse CDT).

http://www.cmake.org/

J'ai fait une très bonne expérience avec lui. Ce que j'ai le plus apprécié, c'est la possibilité de produire une structure de projet générique. Ainsi, vous pouvez inclure de manière générique des sous-projets de recherche de tests unitaires, etc. sans modifier le script à chaque fois.

Ils ont également de nombreux modules sur la façon de trouver les bibliothèques de construction préinstallées, nécessaires au projet (comme Boost, QT, etc.).


Mise à jour : Pendant ce temps, des efforts ont été faits pour introduire la gestion des paquets pour C++. Certains projets méritent d'être examinés :

  • conan.io s'intègre aux principaux outils de construction :
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm basé sur CMake ( Note Le CPM n'est pas activement maintenu).
  • Buckaroo

Note comme l'a souligné @RAM dans les commentaires, cpm n'est plus activement maintenu.

7 votes

J'ai utilisé CMake il y a quelques mois et en effet, la vérification des bibliothèques pré installées a très bien fonctionné. Cependant, les autres dépendances binaires (c'est-à-dire celles provenant de mes sous-projets) ne pouvaient pas être gérées facilement. Est-ce qu'il me manque quelque chose ?

3 votes

@weberste, En fait, il n'existe pas d'outil similaire à maven pour C/C++. Les développeurs essaient de gérer les dépendances avec un outil similaire à apt-get.

1 votes

Cpm n'est pas activement maintenu et est mort depuis début 2015.

18voto

carlos.baez Points 77

Pour la gestion des dépendances, il existe un nouveau projet (c'est une startup) qui met en place ce type d'outil : https://github.com/biicode (un gestionnaire de dépendances C++). Vous pourriez ajouter vos dépendances et cela devrait fonctionner.

Actuellement, le nom du projet est conan.io ils ont été acquis par JFrog .

UPDATE : Le projet est mort... Malheureusement, il semble que la startup n'a pas pu obtenir assez de clients payants, mais le serveur semble fonctionner correctement...

UPDATE2 : Il semble qu'il existe un projet de substitution : conan.io (merci @mucaho)

0 votes

Je peux enlever le lien le projet a été fermé, maintenant c'est conan.io

0 votes

Merci pour la mise à jour ! Je cherche surtout par curiosité, il semble qu'il soit toujours possible de fouiller sur leur github pour le fichier de base. documentation C'est probablement moins bien que ce qui était sur le site Web à un moment donné, mais je suppose que c'est mieux que rien. Je me demande juste si conan.io est juste une nouvelle marque ou si c'est un produit totalement différent ?

1 votes

Il ne s'agit pas d'un changement de marque, mais d'un projet entièrement nouveau, qui part de zéro et qui tient compte de toutes les leçons apprises : il s'agit d'un projet entièrement open source, entièrement décentralisé avec un serveur interne, qui prend en charge tous les systèmes de construction et qui gère les binaires.

5voto

Rich Seller Points 46052

Si vous souhaitez uniquement gérer les dépendances, essayez Ivy il s'intègre parfaitement à Ant (et je suppose que NAnt peut faire la même chose en se basant sur cet exemple). blog qui est lié au site Ivy).

Il existe également Byldan une version .Net de Maven. Mais je ne sais pas si cela vous conviendra.

3voto

Will Points 30630

Make et GCC sont un excellent combo pour une très bonne vérification des dépendances.

GCC peut générer automatiquement des fichiers de dépendance 'make' (commutateur de ligne de commande -MD), afin de pouvoir reconstruire tous les fichiers sources qui dépendent d'un en-tête donné, par exemple.

J'ai quelques règles simples que je coupe/colle dans mes makefiles :

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

Maintenant, si vos fichiers objets sont déclarés dans une liste OBJ_C et 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 peut bien sûr suivre les dépendances avec d'autres projets et autres, par exemple en reconstruisant une librairie partagée si nécessaire.

Par exemple, si vos autres équipes placent toujours leurs dernières DLL dans un dossier partagé :

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

0 votes

Voir mon commentaire joint à la question concernant mes préoccupations quant à cette solution

0 votes

Si une cible dépend d'un autre fichier, par exemple si votre exécutable dépend d'une bibliothèque partagée, vous pouvez avoir une règle pour cette bibliothèque partagée qui assure que votre copie de la bibliothèque est à jour sans avoir besoin de la source, par exemple en récupérant simplement la dernière copie à partir d'un emplacement particulier ou en exécutant une mise à jour du contrôle de version ou autre.

0 votes

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@ J'ai eu du mal à déchiffrer tous ces symboles de marque, mais il semble que cela donne quelque chose du genre g++ -c main.cc -MD -MF test si vous voulez l'exécuter de façon autonome en ligne de commande, et il place les résultats dans un fichier nommé 'test'.

-5voto

Martin v. Löwis Points 61768

Je recommande d'utiliser la mère de tous les systèmes de dépendance de construction : make.

0 votes

J'en fais un usage intensif. GCC peut créer des fichiers de dépendance que 'make' peut manger. Assez pour une autre réponse, peut-être...

8 votes

Make est en fait ce que tout le monde veut éviter/remplacer en regardant les systèmes de construction -automatique-.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X