Generieren von Visual Studio C ++ - Projektdateien mit CMake

91

Ich arbeite an einem Open Source C ++ - Projekt für Code, der unter Linux und Windows kompiliert wird. Ich benutze CMake, um den Code unter Linux zu erstellen. Aus Gründen der Vereinfachung der Entwicklung und aus politischen Gründen muss ich mich unter Windows an Visual Studio-Projektdateien / -Editor halten (ich kann beispielsweise nicht zu Code :: Blocks wechseln ). Ich sehe Anweisungen zum Generieren von Visual Studio-Dateien mit CMake wie hier .

Haben Sie CMake bereits zum Generieren von Visual Studio-Dateien verwendet? Wie war deine Erfahrung? Angenommen, ich möchte meinem Projekt eine neue Datei hinzufügen. Was ist der Workflow dafür?

amit
quelle
Beachten Sie diese Antwort für Benutzer von GNU + Linux, die versuchen, Projektdateien für Visual Studio zu generieren, das Windows-spezifisch ist . TL; DR: Generatoren sind plattformspezifisch und Sie müssen sich in Windows befinden, um dies zu tun.
code_dredd

Antworten:

57

CMake ist dafür eigentlich ziemlich gut. Der Schlüssel war, dass jeder auf der Windows-Seite daran denken muss, CMake auszuführen, bevor er in die Lösung geladen wird, und jeder auf unserer Mac-Seite muss daran denken, es vor dem Erstellen auszuführen.

Das Schwierigste war, als Windows-Entwickler sicherzustellen, dass Ihre strukturellen Änderungen in der Datei cmakelist.txt und nicht in den Lösungs- oder Projektdateien enthalten sind, da diese Änderungen wahrscheinlich verloren gehen und selbst wenn sie nicht verloren gehen, nicht auf die Mac-Seite übertragen werden brauchte sie auch, und die Mac-Leute müssten daran denken, die make-Datei aus den gleichen Gründen nicht zu ändern.

Es erfordert nur ein wenig Nachdenken und Geduld, aber es wird zuerst Fehler geben. Wenn Sie jedoch auf beiden Seiten eine kontinuierliche Integration verwenden, werden diese frühzeitig ausgeschüttelt, und die Menschen werden sich schließlich daran gewöhnen.

Alex
quelle
11
Wenn dies einmal wahr war, ist es nicht mehr. Alle Änderungen an der Datei CMakeLists.txt führen zu einer Neuerstellung des Build-Systems (Projektdateien für Visual Studio, Makefiles usw.). Der Workflow in Visual Studio ist etwas ärgerlich, da Visual Studio die Projektdateien nicht neu generiert, wenn es feststellt, dass sich etwas geändert hat, sondern darauf wartet, dass Sie einen Build ausführen, wodurch ein Dialogfeld angezeigt wird, da der Build abgebrochen werden muss, um ihn erneut zu erstellen -Laden Sie die Projektdatei.
Vitali
1
Die Einschränkung besteht darin, dass Sie den Visual Studio-Compiler nicht über die IDE ausführen müssen. Sie können es auf der Befehlszeile C:\...> MSBuild ALL_BUILD.vcxproj
ausführen
2
@PfunnyGuy Siehe auch cmake --build ..
Detly
@detly Danke! Ich habe das tatsächlich gefunden und benutzt cmake --build . --config Debug -- /nologo /verbosity:minimal /m. Ich werde nach einfügen . target run_tests, um meinen Googletest-Unit-Test auszuführen, und "Debug" kann durch "Release" ersetzt werden. (Das Hinzufügen der Konfigurationsoption für Debug ist optional, da dies die Standardeinstellung ist, aber ich habe sie
eingefügt, um
47

Ich bin mir nicht sicher, ob es in direktem Zusammenhang mit der Frage steht, aber ich habe nach einer Antwort gesucht, wie * .sln aus cmake-Projekten generiert werden kann. Ich habe festgestellt, dass man so etwas verwenden kann:

cmake -G "Visual Studio 10"

Das Beispiel generiert die erforderlichen VS 2010-Dateien aus einer CMakeLists.txt-Eingabedatei

Ghita
quelle
1
Unter stackoverflow.com/questions/11269833/… @Ivan wird darauf hingewiesen, dass dies in eine Datei PreLoad.cmake im selben Ordner wie Ihre CMakeLists.txt der obersten Ebene abgelegt werden kann cmake.
PfunnyGuy
25

Wir haben die Build-Kette unserer Abteilung auf CMake verlagert und hatten einige interne Probleme, da andere Abteilungen unsere Projektdateien verwendeten und es gewohnt waren, sie nur in ihre Lösungen zu importieren. Wir hatten auch einige Beschwerden darüber, dass CMake nicht vollständig in den Visual Studio-Projekt- / Lösungsmanager integriert wurde, sodass Dateien manuell zu CMakeLists.txt hinzugefügt werden mussten. Dies war eine große Unterbrechung des Workflows, an den die Leute gewöhnt waren.

Aber im Allgemeinen war es ein ziemlich reibungsloser Übergang. Wir freuen uns sehr, dass wir uns nicht mehr mit Projektdateien befassen müssen.

Der konkrete Workflow zum Hinzufügen einer neuen Datei zu einem Projekt ist wirklich einfach:

  1. Erstellen Sie die Datei und stellen Sie sicher, dass sie sich an der richtigen Stelle befindet.
  2. Fügen Sie die Datei zu CMakeLists.txt hinzu.
  3. Bauen.

CMake 2.6 führt sich automatisch erneut aus, wenn sich CMakeLists.txt-Dateien geändert haben (und die Lösung / Projekte (halb-) automatisch neu lädt).

Denken Sie daran, dass Sie bei Builds außerhalb der Quelle darauf achten müssen, die Quelldatei nicht im Build-Verzeichnis zu erstellen (da Visual Studio nur das Build-Verzeichnis kennt).

JesperE
quelle
9

Wie Alex sagt, funktioniert es sehr gut. Der einzige schwierige Teil besteht darin, sich daran zu erinnern, Änderungen an den cmake-Dateien vorzunehmen, anstatt in Visual Studio. Auf allen Plattformen ähnelt der Workflow dem von einfachen alten Makefiles.

Aber es ist ziemlich einfach, damit zu arbeiten, und ich hatte keine Probleme damit, dass cmake ungültige Dateien oder ähnliches generiert, sodass ich mir keine Sorgen machen würde.

jalf
quelle
7

CMake erstellt Visual Studio-Projekte und -Lösungen nahtlos. Sie können sogar Projekte / Lösungen für verschiedene Visual Studio-Versionen erstellen, ohne Änderungen an den CMake-Dateien vorzunehmen.

Das Hinzufügen und Entfernen von Quelldateien ist nur eine Frage der Änderung CMakeLists.txtder Liste der Quelldateien und der Neuerstellung der Projekte / Lösungen. Es gibt sogar eine Globbing-Funktion, um alle Quellen in einem Verzeichnis zu finden (obwohl sie mit Vorsicht verwendet werden sollte).

Der folgende Link erklärt das spezifische Verhalten von CMake und Visual Studio sehr gut.

CMake und Visual Studio

ap-osd
quelle
Dieser Link und sein Beispielprojekt sind sehr, sehr nützlich, danke dafür! Ich würde empfehlen, einen Teil des Quellcodes aus dem Github-Repo in Ihre Antwort aufzunehmen, beispielsweise zu erwähnen, dass ein CMake-Projekt einer Lösung entspricht und dass so etwas wie add_executable verwendet wird, um das Äquivalent eines Visual Studio-Projekts hinzuzufügen.
JRH
5

CMake kann wirklich schönes Visual Studio .projs/ generieren .slns, aber es gibt immer das Problem, dass die .cmakeDateien anstelle von .proj/ geändert werden müssen .sln. So wie es jetzt ist, haben wir es wie folgt zu tun:

  1. Alle Quelldateien gehen zu /srcund in Visual Studio sichtbare Dateien sind nur "Links" zu ihnen, die in definiert sind .filter.
  2. Der Programmierer fügt Dateien hinzu / löscht sie, die daran denken, an dem definierten /srcVerzeichnis zu arbeiten, nicht an dem des Standardprojekts.
  3. Wenn er fertig ist, führt er ein Skript aus, das die entsprechenden .cmakeDateien "aktualisiert" .
  4. Er prüft, ob der Code in der neu erstellten Umgebung erstellt werden kann.
  5. Er schreibt den Code fest.

Anfangs hatten wir ein wenig Angst davor, wie es ausgehen wird, aber der Workflow funktioniert wirklich gut und mit einem schönen Diff, der vor jedem Commit sichtbar ist, kann jeder leicht sehen, ob seine Änderungen korrekt in .cmakeDateien zugeordnet wurden.

Eine weitere wichtige Sache, die Sie wissen sollten, ist die mangelnde Unterstützung ( afaik ) für "Lösungskonfigurationen" in CMake. Derzeit müssen Sie zwei Verzeichnisse mit Projekten / Lösungen generieren - eines für jeden Build-Typ (Debug, Release usw.). Es gibt keine direkte Unterstützung für anspruchsvollere Funktionen - mit anderen Worten: Wenn Sie zwischen Konfigurationen wechseln, erhalten Sie nicht das, was Sie erwarten.

Rot XIII
quelle
4
Ab CMake 2.8.10 verfügen generierte Lösungen über die 4 üblichen Build-Konfigurationen, und es gibt Unterstützung für die Definition zusätzlicher benutzerdefinierter Lösungen.
John
0

Ich habe mein eigenes Projekt namens syncProj gestartet. Dokumentations- / Download-Links von hier:

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

Wenn Sie Visual Studio für die Entwicklung verwenden möchten und derzeit nur C ++ unterstützt wird.

Der Hauptvorteil gegenüber anderen make-Systemen besteht darin, dass Sie Ihr Skript tatsächlich debuggen können, da es C # -basiert ist.

Wenn Sie mit syncProj nicht vertraut sind, können Sie Ihre Lösung / Ihr Projekt einfach in ein CS-Skript konvertieren und von diesem Punkt an die Weiterentwicklung fortsetzen.

In cmake müssen Sie alles von Grund auf neu schreiben.

TarmoPikaro
quelle