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


94

Disons que j'ai un projet C ++ 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 d'avoir à construire tous les sous-projets par moi-même?

En bref, je recherche quelque chose qui fait la gestion des dépendances (c'est-à-dire pour les fichiers binaires et les en-têtes) de la même manière que Maven le fait pour Java.

En fait, j'ai essayé d'utiliser Maven pour cela mais c'est plutôt encombrant car je dois créer les packages manuellement et assez fréquemment, Maven manque de récupérer les modifications les plus récentes. De plus, exécuter la compilation est un peu un hack car je dois appeler NAnt depuis Maven (j'utilise la fonctionnalité de NAnt pour créer directement des solutions Visual Studio).

Des conseils et des idées sur la façon de procéder?


Le problème lors de l'utilisation de make est que je dois tout construire au moins une fois et que j'ai donc également besoin des fichiers source pour les dépendances. En particulier, lors de la reconstruction de bibliothèques dépendantes, cela peut prendre beaucoup de temps et affecter gravement la productivité. Ou est-ce que je manque quelque chose?
weberste

3
Cela semble être une question utile. Peut-être que cette question peut être portée sur un autre site plus accueillant pour ces questions? Je recherche les meilleures pratiques pour la gestion des dépendances C ++.
simgineer

C'est environ 10 ans de retard, donc il y a 3 possibilités ici: vous faites une mauvaise utilisation maven, vous manquez tout le point maven, ou il y a 10 ans, quand je n'utilisais pas mavenpour C ++, c'était beaucoup moins utile pour C ++. Je ne peux pas parler pour 2009, mais ces dernières années, par expérience, mavenc'est exactement ce que vous utiliseriez pour le problème que vous décrivez. Il fait exactement ce que vous voulez, de manière assez efficace et bien, et ne fait pas les choses négatives que vous prétendez faire. Toute personne lisant ceci en 2019 ou plus tard devrait fortement envisager de l'utiliser mavenà cette fin.
searchengine27

Réponses:


37

Réponse initiale : Je suggérerais d'utiliser CMake. Il s'agit d'un générateur de fichiers de création multi-plateforme (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. Ce que j'aime le plus, c'est la capacité à produire une structure de projet générique. Vous pouvez donc inclure de manière générique la recherche de sous-projets pour les tests unitaires, etc. sans changer le script à chaque fois.

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


Mise à jour : Entre-temps, des efforts ont été déployés pour introduire la gestion des packages pour C ++. Quelques projets à regarder:

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

Remarque comme indiqué par @RAM dans les commentaires cpm n'est plus activement maintenu.


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

3
@weberste, En fait, il n'y a pas d'outil maven like pour C / C ++. Les développeurs essaient de gérer la gestion des dépendances avec un outil similaire à apt-get.
SunnyShah

1
cpm n'est pas activement maintenu et est mort depuis début 2015.
RAM

@RAM: merci de l'avoir signalé. J'ai ajouté une note dans le post en référence à vous.
ovanes

2
CMake est un système de construction avec une capacité limitée à trouver des dépendances. Ce n'est pas un gestionnaire de dépendances au sens de NPM, Cargo, etc.
sdgfsdh

17

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

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

MISE À JOUR: Le projet est mort ... Malheureusement, il semble que la startup ne puisse pas obtenir suffisamment de clients payants premium, mais le serveur semble fonctionner correctement ...

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


Je peux supprimer le lien .. le projet était fermé, maintenant c'est conan.io
carlos.baez

Merci pour la mise à jour! Je cherche principalement par curiosité, il semble qu'il soit toujours possible de fouiller sur leur github pour la documentation ; ce n'est probablement pas aussi beau que ce qui était sur le site Web à un moment donné, mais je suppose que c'est mieux que rien. Vous vous demandez simplement, est-ce que conan.io est juste une nouvelle image de marque ou est-ce un produit totalement différent?
jrh

1
Pas un changement de marque mais un tout nouveau projet à partir de zéro avec toutes les leçons apprises: complètement open source, entièrement décentralisé avec un serveur en interne, prend en charge tous les systèmes de construction, gère les binaires.
drodri le

8

Je recommande les systèmes de construction de haut niveau suivants:


Le plugin Maven Nar obtient un bon support. Je l'ai utilisé et j'aime jusqu'à présent. Cependant, vous devez comprendre que Maven n'est pas bon pour un repo mono. La plupart des solutions C ++ nécessitent des bibliothèques de partage de gestion de référentiel Mono, etc.
Hans

5

Si vous ne voulez que la gestion des dépendances, essayez Ivy , il s'intègre bien avec Ant (et je suppose que NAnt peut faire de même sur la base de ce blog , qui est lié à partir du site Ivy).

Il existe également Byldan , une version .Net de Maven. Je ne sais pas si cela fonctionnera pour vous.


3

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 source qui dépendent d'un en-tête donné, par exemple.

J'ai quelques règles simples que je coupe-n-coller 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 la reconstruction d'une bibliothèque partagée si nécessaire, aussi.

Par exemple, si vos autres équipes mettent 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

voir mon commentaire joint à la question concernant mes préoccupations concernant cette solution
weberste

Si une cible dépend d'un autre fichier, par exemple votre exécutable dépend d'une bibliothèque partagée, vous pouvez avoir une règle pour cette bibliothèque partagée qui garantit 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 d'un emplacement particulier ou de l'exécution d'une mise à jour de contrôle de version ou autre.
Will

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@J'ai eu du mal à analyser tous ces symboles Make, il semble que cela résout quelque chose comme g++ -c main.cc -MD -MF testsi vous voulez l'exécuter de manière autonome en ligne de commande, et il met les résultats dans un fichier nommé «test».
jrh


2

Je recommande conan , que j'utilisais ces jours-ci. Il est très puissant de gérer toutes les bibliothèques et binaires dépendants de votre projet.


1

Vous pouvez créer un package NuGet pour les bibliothèques utilisées et utiliser NuGet pour la gestion des dépendances.

Voir aussi NuGet pour C ++


1
NuGet est une extension Visual Studio
Toughy

@Toughy, il peut également être utilisé comme une gestion autonome des dépendances. (Fichier exécutable 4M)
Yousha Aleayoub

0

Il existe un certain nombre d'outils au-dessus des SCons, fournissant des fonctionnalités de plus haut niveau similaires à celles des Autotools qui tentent de faciliter la vie des développeurs (par exemple WAF, SNOCS). Malheureusement, SCons lui-même a l'inconvénient majeur - un temps de compilation plus long pour les grands projets.

Je peux recommander d'essayer SNOCS (qui est un SCons inversé) pour ceux d'entre vous qui recherchent une gestion facile des dépendances et qui choisissent les options de compilation dans la commande unique (compilateur, x86 / x64, Debug / Release, bibliothèques statiques / partagées, test / installer des cibles, etc.).

SNOCS essaie également de s'attaquer au problème du temps de compilation long en stockant la sortie de configuration des projets dans des fichiers séparés, ce qui permet aux builds conséquents de sauter complètement la phase de configuration et de passer directement à la phase de construction (la dernière fonctionnalité est en cours de construction maintenant)

La configuration de CMake devient fastidieuse dans une solution plus grande, de sorte que la maintenance du système de construction prend une grande partie du temps du développeur. Heureusement, comme Martijn l'a déjà mentionné, il existe un biicode qui "utilise CMake pour générer votre projet avec ses dépendances".


-1

Essayez SCons

SCons est un outil de construction de logiciels Open Source, c'est-à-dire un outil de construction de nouvelle génération. Considérez SCons comme un substitut multiplateforme amélioré à l'utilitaire Make classique avec des fonctionnalités intégrées similaires à autoconf / automake et aux caches de compilateurs tels que ccache. En bref, SCons est un moyen plus simple, plus fiable et plus rapide de créer des logiciels.


3
SCons n'a pas de gestion des dépendances ou de référentiel intégré comme demandé.
Maxime Viargues

-3

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


J'utilise ce largement. GCC peut créer des fichiers de dépendance que «make» peut manger. Assez pour une autre réponse, peut-être ...
Will

8
make est en fait ce que tout le monde veut éviter / remplacer en regardant les systèmes de build -automation-
chila

-6

Essayez scons, vous serez accro. La fabrication est obsolète, difficile et coûteuse à entretenir.


J'ai jeté un œil à Scons mais je n'ai pas trouvé de moyen de gérer les dépendances binaires. Avez-vous un exemple pour cela?
weberste

1
Puisque scons est python, vous pouvez coder tout ce que vous voulez pour gérer vos dépendances binaires assez facilement. Peut-être qu'avoir un "SConscript" dans le répertoire de vos dépendances binaires peut aussi aider. Je ne sais pas quelles sont vos exigences ici. Pedro.
piotr

16
Vous proposez donc un outil basé sur "Je ne suis pas sûr de ce dont vous avez besoin, mais vous pouvez le programmer vous-même en Python". Pourquoi avez-vous besoin de scons alors?
jalf
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.