Utilizzo di CMake per generare file di progetto Visual Studio C ++


91

Sto lavorando a un progetto C ++ open source, per codice che si compila su Linux e Windows. Uso CMake per creare il codice su Linux. Per facilità di configurazione dello sviluppo e motivi politici, devo attenermi ai file / editor di progetto di Visual Studio su Windows (non posso passare a Code :: Blocks , ad esempio). Vedo le istruzioni per generare file di Visual Studio utilizzando CMake, come qui .

Hai già utilizzato CMake per generare file di Visual Studio? Come è stata la tua esperienza? Supponiamo che io voglia aggiungere un nuovo file al mio progetto. Qual è il flusso di lavoro per questo?


1
Per quelli in GNU + Linux che cercano di generare file di progetto per Visual Studio, che è specifico di Windows, tieni a mente questa risposta . TL; DR: i generatori sono specifici della piattaforma e per farlo devi essere in Windows.
code_dredd

Risposte:


57

CMake è in realtà abbastanza buono per questo. La parte fondamentale era che tutti sul lato Windows dovevano ricordarsi di eseguire CMake prima di caricare la soluzione, e tutti sul nostro lato Mac avrebbero dovuto ricordarsi di eseguirlo prima di make.

La parte più difficile è stata come sviluppatore Windows assicurandosi che le modifiche strutturali fossero nel file cmakelist.txt e non nella soluzione o nei file di progetto poiché tali modifiche sarebbero probabilmente andate perse e anche se non perse non sarebbero state trasferite sul lato Mac che anche loro ne avevano bisogno, ei ragazzi del Mac avrebbero dovuto ricordarsi di non modificare il file make per gli stessi motivi.

Richiede solo un po 'di riflessione e pazienza, ma all'inizio ci saranno degli errori. Ma se stai usando l' integrazione continua da entrambi i lati, questi verranno scossi presto e le persone alla fine prenderanno l'abitudine.


11
Se questo era vero una volta, non lo è più. Qualsiasi modifica al CMakeLists.txt provocherà una rigenerazione del sistema di compilazione (file di progetto per visual studio, makefile, ecc.). Il flusso di lavoro all'interno di Visual Studio è un po 'fastidioso poiché Visual Studio non rigenera i file di progetto quando rileva che le cose sono cambiate, ma attende invece che tu esegua una compilazione che fa apparire una finestra di dialogo poiché la compilazione deve essere interrotta per -caricare il file di progetto.
Vitali

1
L'avvertenza è che non è necessario eseguire il compilatore di Visual Studio tramite l'IDE. Puoi eseguirlo dalla riga di comando:C:\...> MSBuild ALL_BUILD.vcxproj
PfunnyGuy

2
@PfunnyGuy Vedi anche cmake --build ..
detly

@detly Grazie! In realtà l'ho trovato e l'ho usato cmake --build . --config Debug -- /nologo /verbosity:minimal /m. Lo . target run_testsinserirò dopo per eseguire il mio test unitario googletest e "Debug" può essere sostituito con "Rilascio". (L'aggiunta dell'opzione di configurazione per Debug è facoltativa, poiché è l'impostazione predefinita, ma l'ho inclusa per mostrare come può essere scambiata con "Release")
PfunnyGuy

47

Non sono sicuro che sia direttamente correlato alla domanda, ma stavo cercando una risposta su come generare * .sln da progetti cmake ho scoperto che si può usare qualcosa del genere:

cmake -G "Visual Studio 10"

L'esempio genera i file VS 2010 necessari da un file CMakeLists.txt di input


1
A stackoverflow.com/questions/11269833/... punti @Ivan che questo può essere messo in un file PreLoad.cmake nella stessa cartella di livello superiore CMakeLists.txt e poi si può semplicemente fare cmake.
PfunnyGuy

25

Abbiamo spostato la catena di build del nostro dipartimento su CMake e abbiamo avuto alcuni roadbump interni poiché altri reparti utilizzavano i nostri file di progetto e erano abituati a importarli semplicemente nelle loro soluzioni. Abbiamo anche lamentato che CMake non fosse completamente integrato nel project / solution manager di Visual Studio, quindi i file dovevano essere aggiunti manualmente a CMakeLists.txt; questa è stata una grande interruzione nel flusso di lavoro a cui le persone erano abituate.

Ma in generale è stata una transizione abbastanza fluida. Siamo molto felici perché non dobbiamo più occuparci dei file di progetto.

Il flusso di lavoro concreto per aggiungere un nuovo file a un progetto è davvero semplice:

  1. Crea il file, assicurati che sia nella posizione corretta.
  2. Aggiungi il file a CMakeLists.txt.
  3. Costruire.

CMake 2.6 si riavvia automaticamente se qualche file CMakeLists.txt è cambiato (e (semi-) ricarica automaticamente la soluzione / i progetti).

Ricorda che se stai eseguendo build out-of-source, devi fare attenzione a non creare il file sorgente nella directory build (poiché Visual Studio conosce solo la directory build).


9

Come dice Alex, funziona molto bene. L'unica parte difficile è ricordarsi di apportare modifiche ai file cmake, piuttosto che dall'interno di Visual Studio. Quindi su tutte le piattaforme, il flusso di lavoro è simile a se avessi usato semplici vecchi makefile.

Ma è abbastanza facile da lavorare e non ho avuto problemi con cmake che genera file non validi o qualcosa del genere, quindi non mi preoccuperei troppo.


7

CMake produce progetti e soluzioni di Visual Studio senza problemi. Puoi persino produrre progetti / soluzioni per diverse versioni di Visual Studio senza apportare modifiche ai file CMake.

L'aggiunta e la rimozione di file sorgente è solo questione di modificare il CMakeLists.txtquale ha l'elenco dei file di origine e rigenerare i progetti / soluzioni. C'è anche una funzione globbing per trovare tutti i sorgenti in una directory (sebbene dovrebbe essere usata con cautela).

Il collegamento seguente spiega molto bene il comportamento specifico di CMake e Visual Studio.

CMake e Visual Studio


Quel collegamento e il suo progetto di esempio sono molto, molto utili, grazie per questo! Consiglierei di incorporare parte del codice sorgente dal repository GitHub nella tua risposta, ad esempio menzionando che un progetto CMake è l'equivalente di una soluzione e che qualcosa come add_executable viene utilizzato per aggiungere l'equivalente di un progetto di studio visivo.
jrh

5

CMake può generare Visual Studio .projs/ davvero carino .slns, ma c'è sempre il problema con la necessità di modificare i .cmakefile piuttosto che .proj/ .sln. Così com'è ora, lo trattiamo come segue:

  1. Tutti i file sorgente vengono indirizzati /srcei file visibili in Visual Studio sono solo "collegamenti" a essi definiti in .filter.
  2. Il programmatore aggiunge / cancella i file ricordandosi di lavorare sulla /srcdirectory definita , non su quella del progetto di default.
  3. Quando ha finito, esegue uno script che "aggiorna" i rispettivi .cmakefile.
  4. Controlla se il codice può essere creato nell'ambiente ricreato.
  5. Commette il codice.

All'inizio avevamo un po 'paura di come andrà a finire, ma il flusso di lavoro funziona davvero bene e con una bella differenza visibile prima di ogni commit, tutti possono facilmente vedere se le sue modifiche sono state mappate correttamente nei .cmakefile.

Un'altra cosa importante da sapere è la mancanza di supporto ( afaik ) per "Configurazioni di soluzioni" in CMake. Allo stato attuale, devi generare due directory con progetti / soluzioni, una per ogni tipo di build (debug, rilascio, ecc.). Non c'è supporto diretto per funzionalità più sofisticate, in altre parole: il passaggio da una configurazione all'altra non ti darà ciò che potresti aspettarti.


4
A partire da CMake 2.8.10, le soluzioni generate hanno le 4 configurazioni di build abituali ed è disponibile il supporto per la definizione di altre personalizzate.
John


0

Ho iniziato il mio progetto, chiamato syncProj. Link alla documentazione / download da qui:

https://docs.google.com/document/d/1C1YrbFUVpTBXajbtrC62aXru2om6dy5rClyknBj5zHU/edit# https://sourceforge.net/projects/syncproj/

Se hai intenzione di usare Visual Studio per lo sviluppo e attualmente è supportato solo C ++.

Il vantaggio principale rispetto ad altri sistemi make è che puoi effettivamente eseguire il debug dello script, poiché è basato su C #.

Se non hai familiarità con syncProj, puoi semplicemente convertire la tua soluzione / progetto in script .cs e continuare lo sviluppo da quel punto in poi.

In cmake dovrai scrivere tutto da zero.

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.