Wer unter Windows mit C/C++ entwickelt muss nicht unbedingt Microsoft Visual Studio verweden. Diese Blogreihe zeigt Alternativen, die auf freier Software basieren und für alle Betriebsystemen verfügbar sind. Das kann etwa ein Vorteil sein, wenn ein Team unterschiedliche Betriebssysteme verwendet und dennoch die gleiche Toolchain verwenden möchte. Zudem sind die Alternativen kostenfrei.

Um die Verwendung der vorgestellten Toolchains zu demonstrieren verwenden wir das Google Test Demoprojekt auf GitHub.

MinGW

MinGW steht für Minimalist GNU for Windows und ist ein Sammlung von Open Source Werkzeugen zur Softwareentwicklung für Windows. Die enthaltenen Werkzeuge sind:

  • Die Gnu Compiler Collection (GCC) mit Compilern für C, C++, Fortran und ADA
  • Werkzeuge zum Erzeugen von Archiven, dynamisch ladbaren Bibliotheken und ausführbaren Dateien
  • Gnu Debugger (GDB) und weitere Werkzeuge wie gcov zur Analyse der Codeabdeckung.

Anders als Cygwin, das wir im nächsten Blog behandeln, verwenden die Programme, die man mit MinGW erzeugt, keine eigene Laufzeitbibliothek. Stattdessen verwenden diese die Microsoft Bibliotheken, die Teil jeder Windows-Installation sind. Deswegen entstehen keine lizenzrechtlichen Probleme durch die Verwendung von MinGW.

MinGW ist im übrigen für Linux und MacOS verfügbar und erlaubt damit Cross Compilation für Windows auf diesen Plattformen.

MinGW-w64

MinGW-w64 wurde 2005 von OneVision begonnen um eine Objective-C Anwendung nach Windows zu portieren. Die Autoren von MinGW wollten den Code wegen lizenrechtlicher Bedenken nicht übernehmen, da OpenVision die Windows-API mittels Reinraum-Implementierung entwickelt hat. Deswegen hat OneVision 2008 das Projekt als Fork von MinGW auf Sourceforge veröffentlicht. Momentan arbeiten etwa 20 Entwickler an dem Projekt. MinGW-w64 kann im Gegensatz zu MinGW auch 64 Bit Binaries erzeugen und unterstützt mehr Funktionen der Windows API. Auch der Versuch des Autors Google Test mit MinGW zu übersetzen scheiterte. Mit MinGW-w64 ist dies problemlos möglich. Wie MinGW ist MinGW-w64 für alle gängigen Betriebssystem verfügbar.

Nebenläufigkeit

Grundsätzlich hat man zwei Möglichkeiten Nebenläufigkeit zu implementieren: Entweder man verwendet die Windows-API (_beginthread, _cwait, etc.) zum Erzeugen und Verwalten von Threads oder man benutzt die Posix-konforme Pthreads-Bibliothek. Der Vorteil letzterer Variante liegt darin, dass der Code für jedes Posix-konforme System wie Linux und MacOS übersetzen lässt.

Leider wird die C++ Thread support library von der mit MinGW-w64 gelieferten Standardbibliothek nicht implementiert. Es gibt jedoch eine Implementierung für MinGW auf GitHub: mingw-std-threads. Eine weitere portable Alternative bietet Boost Thread.

Google Test Demo Projekt

Im Folgenden werden wir Schritt für Schritt das Demo Projekt herunterladen, übersetzen und ausführen. Dafür benötigen wir:

Nach Installation aller benötigten Pakete Klonen wir das Demo Projekt:
git clone https://github.com/bast/gtest-demo

Danach erzeugen wir ein Verzeichnis in dem wir das Projekt übersetzen werden und wechseln in dieses Verzeichnis:
mkdir gtest-demo\build
cd gtest-demo build

Das Demo Projekt verwendet einen alten Google Test Release, der mit MinGW nicht funktioniert. Daher ändern wir die Google Test Version von 1.8.0 auf 1.10.0. Dazu öffnen wir die Datei gtest-demo/cmake/googletest-download.cmake und ändern Zeile 10:

@@ -12,7 +12,7 @@ ExternalProject_Add(
GIT_REPOSITORY
https://github.com/google/googletest.git
GIT_TAG
- release-1.8.0
+ release-1.10.0
CONFIGURE_COMMAND ""
BUILD_COMMAND ""

Jetzt lassen wir CMake das Ninja Build System erzeugen:
cmake -G Ninja ..

Und übersetzen das Projekt mit:
cmake --build .

Jetzt können wir das Demo Projekt ausführen:
bin\unit_tests.exe

Und wenn wir alles richtig gemacht haben, sehen wir diesen Testreport:
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from example
[ RUN ] example.subtract
[ OK ] example.subtract (0 ms)
[ RUN ] example.add
[ OK ] example.add (0 ms)
[----------] 2 tests from example (11 ms total)

[———-] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (30 ms total)
[ PASSED ] 2 tests.