Gestione delle dipendenze simile a Maven per C ++? [chiuso]


94

Supponiamo che io abbia un progetto C ++ suddiviso in diversi sottoprogetti. Tutti i sottoprogetti producono una DLL e diversi team di sviluppatori lavorano su ogni sottoprogetto. Ora, se voglio costruire il progetto principale, c'è un modo per evitare di dover costruire tutti i sottoprogetti da solo?

In breve, sto cercando qualcosa che faccia la gestione delle dipendenze (cioè per file binari e intestazioni) in modo simile a Maven per Java.

In effetti, ho provato a usare Maven per questo ma questo è piuttosto macchinoso perché devo creare i pacchetti manualmente e abbastanza frequentemente, Maven manca di raccogliere le modifiche più recenti. Inoltre, eseguire la compilation è un po 'un trucco in quanto devo chiamare NAnt da Maven (utilizzo la funzionalità di NAnt per creare direttamente soluzioni Visual Studio).

Qualche suggerimento e idea su come farlo?


Il problema quando si usa make è che devo costruire tutto almeno una volta e quindi ho bisogno anche dei file sorgente per le dipendenze. In particolare, la ricostruzione di librerie dipendenti può richiedere molto tempo e influire gravemente sulla produttività. Oppure mi sfugge qualcosa?
weberste

3
Sembra una domanda utile. Forse questa domanda può essere trasferita su un altro sito che è più accogliente per queste domande? Sto cercando le migliori pratiche per la gestione delle dipendenze c ++.
simgineer

Questo è in ritardo di circa 10 anni, quindi ci sono 3 possibilità qui: stai abusando maven, ti stai perdendo l'intero punto maven, o 10 anni fa, quando non stavo usando mavenper C ++, era molto meno utile per C ++. Non posso parlare per il 2009, ma negli ultimi anni per esperienza, mavenè esattamente quello che useresti per il problema che stai descrivendo. Fa esattamente quello che vuoi, e in modo abbastanza efficiente e bene, e non fa le cose negative che dici che fa. Chiunque legga questo nel 2019 o successivamente dovrebbe prendere in seria considerazione l'utilizzo mavenper questo scopo.
searchengine27

Risposte:


37

Risposta iniziale : suggerirei di utilizzare CMake. È un generatore di file make multipiattaforma (genera anche progetti Visual Studio o Eclipse CDT).

http://www.cmake.org/

Ho fatto davvero una bella esperienza con esso. La cosa migliore che mi piace è stata la capacità di produrre una struttura di progetto generica. Quindi puoi includere genericamente la ricerca di sottoprogetti per unit test ecc. Senza cambiare lo script ogni volta.

Hanno anche molti moduli su come trovare librerie di build preinstallate, necessarie per il progetto (come Boost, QT ecc.)


Aggiornamento : nel frattempo c'è stato qualche sforzo per introdurre la gestione dei pacchetti per C ++. Alcuni progetti da guardare:

  • conan.io si integra con i principali strumenti di compilazione:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm basato su CMake ( nota che il CPM non viene mantenuto attivamente).
  • Buckaroo

Nota come sottolineato da @RAM nei commenti cpm non è più attivamente mantenuto.


7
Ho usato CMake alcuni mesi fa e in effetti, il controllo delle librerie preinstallate ha funzionato molto bene. Tuttavia, altre dipendenze binarie (cioè quelle provenienti dai miei sottoprogetti) non potevano essere gestite facilmente. Mi sto perdendo qualcosa?
weberste

3
@weberste, In realtà non esiste uno strumento simile a Maven per C / C ++. Gli sviluppatori cercano di gestire la gestione delle dipendenze con uno strumento simile ad apt-get.
SunnyShah

1
cpm non è gestito attivamente ed è morto dall'inizio del 2015.
RAM

@ RAM: grazie per averlo fatto notare. Ho aggiunto una nota nel post con riferimento a te.
ovanes

2
CMake è un sistema di compilazione con capacità limitata di trovare dipendenze. Non è un gestore delle dipendenze nel senso di NPM, Cargo, ecc.
sdgfsdh

17

Per la gestione delle dipendenze, esiste un nuovo progetto (è una startup) che sta implementando questo tipo di strumento: https://github.com/biicode (un gestore delle dipendenze C ++). Potresti aggiungere le tue dipendenze e dovrebbe funzionare.

Attualmente, il nome del progetto è conan.io , sono stati acquisiti da JFrog .

AGGIORNAMENTO: Il progetto è morto ... Sfortunatamente, sembra che l'avvio non sia riuscito a ottenere abbastanza clienti paganti premium, ma il server sembra funzionare bene ...

UPDATE2: Sembra che ci sia un progetto sostitutivo: conan.io (grazie @mucaho)


Posso rimuovere il link .. il progetto è stato chiuso, ora è conan.io
carlos.baez

Grazie per l'aggiornamento! Per lo più guardo solo per curiosità, sembra che sia ancora possibile dare un'occhiata al loro GitHub per la documentazione ; probabilmente non è così bello come quello che c'era sul sito web a un certo punto, ma immagino che sia meglio di niente. Mi chiedevo solo, conan.io è solo un rebranding o è un prodotto completamente diverso?
jrh

1
Non un rebranding ma un progetto completamente nuovo da zero con tutte le lezioni apprese: completamente open source, completamente decentralizzato con un server interno, supporta tutti i sistemi di compilazione, gestisce i binari.
drodri

8

Raccomando i seguenti sistemi di compilazione di alto livello:


Il plugin Maven Nar ottiene un buon supporto. L'ho usato e mi piace finora. Tuttavia devi capire che Maven non va bene per un repo mono. La maggior parte delle soluzioni C ++ necessita di un repository Mono per gestire le librerie di condivisione e simili.
Hans

5

Se vuoi solo la gestione delle dipendenze, prova Ivy , si integra bene con Ant (e presumo che NAnt possa fare lo stesso sulla base di questo blog , che è collegato dal sito Ivy).

C'è anche Byldan , una versione .Net di Maven. Non so quanto bene funzionerà per te però.


3

Make e GCC sono un'ottima combinazione per un controllo delle dipendenze davvero buono.

GCC può generare automaticamente i file di dipendenza "make" (switch della riga di comando -MD), in modo da poter ricostruire tutti i file sorgente che dipendono da una data intestazione, per esempio.

Ho alcune semplici regole che taglio e incollo nei miei makefile:

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

Ora se i tuoi file oggetto sono dichiarati in un elenco OBJ_C e 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 può ovviamente tenere traccia delle dipendenze con altri progetti e simili, ad esempio anche ricostruire una libreria condivisa se necessario.

Ad esempio, se gli altri tuoi team inseriscono sempre le loro ultime DLL in una cartella condivisa:

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

vedere il mio commento allegato alla domanda riguardante le mie preoccupazioni con questa soluzione
weberste

Se una destinazione dipende da un altro file, ad es. Il tuo eseguibile dipende da una libreria condivisa, puoi avere una regola per quella libreria condivisa che assicuri che la tua copia della libreria sia aggiornata senza bisogno del sorgente, ad es. Semplicemente recuperando l'ultima copia da una posizione particolare o dall'esecuzione di un aggiornamento del controllo della versione o simili.
Will il

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Ho avuto difficoltà ad analizzare tutti questi simboli Make, sembra che questo si risolva in qualcosa di simile g++ -c main.cc -MD -MF testse vuoi eseguirlo da solo sulla riga di comando e mette i risultati in un file chiamato "test".
jrh


2

Raccomando conan , che stavo usando in questi giorni. È molto potente mantenere tutte le librerie e i file binari dipendenti nel progetto.


1

È possibile creare un pacchetto NuGet per le librerie usate e usare NuGet per la gestione delle dipendenze.

Vedere anche NuGet per C ++


1
NuGet è un'estensione di Visual Studio
Toughy

@ Robusto, può essere utilizzato anche come gestione autonoma delle dipendenze. (File eseguibile 4M)
Yousha Aleayoub

0

C'è un certo numero di strumenti posti sopra SCons, che forniscono funzionalità di livello superiore simili a quelle degli Autotools che stanno cercando di rendere la vita più facile agli sviluppatori (es. WAF, SNOCS). Sfortunatamente, SCons stesso ha il principale svantaggio: tempi di compilazione più lunghi per i grandi progetti.

Posso consigliare di provare SNOCS (che è uno SCons invertito) per quelli di voi che cercano una facile gestione delle dipendenze e scelgono le opzioni di compilazione nel singolo comando (compilatore, x86 / x64, Debug / Release, librerie statiche / condivise, test / installare obiettivi, ecc.).

SNOCS cerca anche di affrontare il problema del lungo tempo di compilazione memorizzando l'output di configurazione del progetto in file separati, il che consente alle build successive di saltare del tutto la fase di configurazione e andare direttamente alla fase di costruzione (l'ultima funzionalità è in costruzione ora)

La configurazione di CMake diventa noiosa in soluzioni più grandi, quindi la manutenzione del sistema di compilazione richiede una grossa frazione del tempo dello sviluppatore. Fortunatamente, come già accennato da Martijn, esiste un biicode che "utilizza CMake per generare il progetto con le sue dipendenze".


-1

Prova SCons

SCons è uno strumento di creazione di software Open Source, ovvero uno strumento di creazione di nuova generazione. Pensa a SCons come un sostituto multipiattaforma migliorato per la classica utility Make con funzionalità integrate simili a autoconf / automake e cache del compilatore come ccache. In breve, SCons è un modo più semplice, affidabile e veloce per creare software.


3
SCons non ha alcun repository o gestione delle dipendenze integrato come richiesto.
Maxime Viargues

-3

Consiglio di utilizzare la madre di tutti i sistemi di dipendenze di compilazione: make.


Lo uso ampiamente. GCC può creare file di dipendenza che "make" può mangiare. Abbastanza per un'altra risposta, forse ...
Will

8
make è in realtà ciò che tutti vogliono evitare / sostituire guardando i sistemi di automazione build
chila

-6

Prova gli scons, rimarrai conquistato. Make è obsoleto, difficile e costoso da mantenere.


Ho dato un'occhiata a Scons ma non ho trovato un modo per gestire le dipendenze binarie. Hai un esempio per questo?
weberste

1
Poiché scons è python, puoi codificare qualsiasi cosa tu voglia per gestire le tue dipendenze binarie abbastanza facilmente. Forse anche avere uno "SConscript" nella directory delle dipendenze binarie aiuta. Non sono sicuro di quali siano le tue esigenze qui difficili. Pedro.
piotr

16
Quindi stai suggerendo uno strumento basato su "Non sono sicuro di quello che ti serve, ma puoi programmarlo da solo in Python". Allora perché hai bisogno di scons?
jalf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.