(Video) Grundsätzliche Funktionsweise von CMake

Durch Zufall bin ich auf ein deutsches Video gestoßen, dass erklärt, wie die Funktionsweise von CMake unter Linux ist (CMake -> Make -> kompiliertes Projekt).

Ein weiterer Punkt, warum es sich lohnt CMake zu verwenden und der im Video aber nicht ganz dargestellt wird ist der, dass man aus einer CMakeLists.txt nicht nur ein Makefile generieren kann, sondern z.B. auch eine Solutionsdatei für Visual Studio und andere Buildsysteme.

../../src/pdf/SkDeflate.cpp(16,10): fatal error: ‘zlib.h’ file not found

Beim Bauen der Bibliothek skia auf Windows bekam ich kürzlich diese Fehlermeldung:

../../src/pdf/SkDeflate.cpp(16,10): fatal error: 'zlib.h' file not found

Wie sich herausstellte, musste ich beim Bauen noch einige Include-Ordner zu den extra_cflags hinzufügen, damit der Bau von skia erfolgreich durchlaufen konnte (hier fett dargestellt):

bin\gn gen out/Static --args="is_official_build=true clang_win=\"C:\Program Files\LLVM\" extra_cflags=[ \"-IC:\pfad\zu\skia\third_party\externals\zlib\" ]"

CMake-Beispiel mit harfbuzz

In diesem Post möchte ich ein kleines Beispiel zeigen, wie man ein C++-Projekt mit harfbuzz kompiliert. Das alles zeige ich in einem CentOS docker Container. Aber das sollte eigentlich keinen Unterschied machen, d.h. das gezeigte Beispiel sollte auch auf einem normalen Linuxsystem funktionieren.

Für dieses Beispiel habe ich ein einfaches “Hello World”-Beispiel genommen, dass man üblicherweise in jedem C++-Anfängerbuch findet. Diese Datei habe ich main.cpp benannt:

#include <iostream>

int main(int argc, char **argv) {
        std::cout << "Hello World!" << std::endl;
        return 0;
}

Obwohl es hier keinen Code gibt der auf die Bibliothek harfbuzz verweist, kann man diesen Code problemlos gegen diese Bibliothek kompilieren / linken. Ich gehe davon aus, dass normalerweise auch der entsprechende Code in den Quelltextdateien zu finden ist, aber für diesen Post ist das nicht vonnöten. Jetzt muss ich nur noch die CMakeLists.txt entsprechend anpassen:

cmake_minimum_required(VERSION 3.0)
# Projektname setzen
project(harfbuzz_ex1)

# Alle Quelltextdateien in eine Variable packen
set(SOURCES main.cpp)

# Eine ausführbare Datei soll generiert werden ...
add_executable(${PROJECT_NAME} ${SOURCES})

# ... mit harfbuzz als abhängige Bibliothek
target_link_libraries(${PROJECT_NAME} harfbuzz)

Ist die CMakeLists.txt fertig, kann man mit dem Kompilieren / Linken anfangen:

cmake -G "Unix Makefiles" .
make

Beim ersten Versuch das Projekt zu übersetzen, bekam ich diese Fehlermeldung:

sh-4.2# make
[ 50%] Linking CXX executable harfbuzz_ex1
/usr/bin/ld: cannot find -lharfbuzz
collect2: error: ld returned 1 exit status
make[2]: *** [harfbuzz_ex1] Error 1
make[1]: *** [CMakeFiles/harfbuzz_ex1.dir/all] Error 2
make: *** [all] Error 2

Ich hatte die Bibliothek harfbuzz noch gar nicht auf meinem System installiert. Das musste ich natürlich schnell nachholen:

yum install -y harfbuzz-devel

Danach reichte es aus nochmal make aufrufen und schon konnte ich mein Projekt problemlos bauen und ausführen:

sh-4.2# make
[ 50%] Linking CXX executable harfbuzz_ex1
[100%] Built target harfbuzz_ex1
sh-4.2# ./harfbuzz_ex1
Hello World!