Eine statische Bibliothek unter Linux mit CMake erstellen

In diesem Post möchte ich ein kleines Beispiel zeigen, wie man eine statische C++ Bibliothek unter Linux mit Hilfe von CMake baut. Dazu habe ich eine sehr einfache C++-Datei namens funcs.cpp erstellt. Die in der Datei enthaltene Funktion add soll zu Beispielzwecken dann in der statischen Bibliothek enthalten sein.

int add(int a, int b)
{
  return (a+b);
}

Die schon erwähnte Funktion add soll zu Beispielzwecken einfach zwei ganze Zahlen addieren. Um die Datei nun in eine statische Bibliothek zu packen, wird eine weitere Datei namens CMakeLists.txt benötigt, die in etwa so aussieht:

cmake_minimum_required(VERSION 3.6)

# Projektname definieren
project(static_test)

# Liste aller Quelldateien in einer Variablen speichern.
# Aus diesen Dateien entsteht dann die statische Bibliothek
set(ST_SOURCES funcs.cpp)

# CMake sagen, dass eine statische Bibliothek erstellt werden soll.
add_library(static_test STATIC ${ST_SOURCES})

Mit dem Kommando project definiert man den Projektnamen. Mit dem Kommando set wird eine neue Variable namens ST_SOURCES erstellt und gleich definiert. Dabei soll ST_SOURCES aus einer Liste aller Quelltextdateien bestehen, die für die statische Bibliothek nötig sind. Da wir in diesem Beispiel nur eine Datei haben, enthält die Liste ST_SOURCES nur einen Eintrag namens funcs.cpp. Man kann hier aber auch mehrere Dateinamen oder -pfade hintereinander setzen, getrennt durch ein Leerzeichen. Der Variablenname ist frei wählbar, muss aber gültig sein.

Das Kommando add_library sagt CMake nun, dass wir eine Bibliothek bauen wollen. Erst das STATIC in dem Kommando macht CMake klar, dass es sich um eine statische Bibliothek handeln muss. Will man jedoch eine dynamische Bibliothek, ersetzt man das STATIC einfach durch SHARED.

Beide Dateien befinden sich im selben Ordner.

Wenn man nun die CMakeLists.txt erstellt hat, muss man anschließend in die Kommandozeile diese zwei Befehle eingeben:

cmake -G "Unix Makefiles" .
make
Die statische Bibliothek wird gebaut.

Der erste Befehl (cmake …) erstellt nun das entsprechende Makefile. Ist das erstellt, kann man make starten und die statische Bibliothek wird erstellt.

Ist alles erfolgreich verlaufen, müsste man nun im Ordner eine Datei namens libstatic_test.a finden.

Der Bau der statischen Bibliothek war erfolgreich.

Ein Visual Studio 2019 Projekt mit CMake erstellen

Seit der Version 3.14 kann man mit CMake Visual Studio 2019 Projekte erstellen. In diesem Post möchte ich kurz zeigen, wie das möglich ist.

Um dieses Beispiel erfolgreich zum Laufen zu bringen, müssen einige Bedingungen erfüllt sein:

  • Visual Studio 2019 muss auf dem Rechner installiert sein.
  • CMake 3.14 (oder höher) muss installiert sein
  • Der Pfad zur cmake.exe muss in der PATH Variable enthalten sein

Mehr braucht es auch nicht. Nun will ich aber mit meinem Beispiel fortfahren. Mein Beispielprojekt für diesen Post besteht nur aus einer einzigen C++-Datei. Das Programm am Ende soll einfach ein Hallo, Welt! in der Kommandozeile ausgeben:

include <iostream>
int main(int argc, char **argv)
{
std::cout << "Hallo, Welt!" << std::endl;
return 0;
}

Wenn man Projekte mit CMake erstellt, gehört dazu eine Datei mit dem Namen CMakeLists.txt. Für dieses Beispiel sieht die so aus:

project(example1)

set(SOURCE_FIlES main1.cpp)

add_executable(example1 ${SOURCE_FIlES})

In der CMakeLists.txt definiere ich in der ersten Zeile den Projektnamen. Diese Zeile sorgt später dafür, dass am Ende eine Solutionsdatei namens example1.sln existiert. Diese Solutionsdatei werden wir später nutzen, um mit Hilfe von Visual Studio 2019 aus dem Code eine ausführbare Datei zu produzieren.

Als nächstes werden alle nötigen Codedateien in der Variablen SOURCE_FILES aufgelistet. Für komplexere Projekte gibt es andere Methoden, aber für unser Beispiel hier ist das ausreichend.

In der letzten Zeile sagen wir dann, dass wir aus den Codedateien eine ausführbare Datei namens example1 erstellt haben wollen (add_executable). Da wir hier unter Windows arbeiten und Visual Studio 2019 nutzen, brauchen wir die Endung hier nicht zu schreiben.

Sowohl die CMakeLists.txt wie auch die C++-Datei sollten in diesem Beispiel in einem Ordner nebeneinander liegen:

CMakeLists.txt und main1.cpp liegen in einem Ordner

Da wir das Projekt nachher noch mit Visual Studio 2019 bauen wollen, rufen wir die x64 Native Tools Command Prompt for VS 2019 aus dem Startmenü auf:

Nun müsste ein Fenster wie das Folgende auftauchen:

In der gestarteten Kommandozile müssen wir nun in den Ordner wechseln, in dem sich die CMakeLists.txt befindet. Sind wir dort, rufen wir CMake mit folgendem Kommando auf:

cmake -G "Visual Studio 16 2019" .

Der Punkt am Ende steht gewollt da. Ist alles gut gegangen, sehen wir am Ende diese Meldung (der Pfad kann sich hierbei anders sein):

-- Build files have been written to: C:/Users/jenkins/Documents/cmake1

Ist alles erfolgreich verlaufen, müsste man in dem Ordner eine Datei namens example1.sln finden. Daneben auch eine example1.vcxproj. Diese Solutionsdatei kann man nun in Visual Studio öffnen oder anderweitig bearbeiten. Jetzt können wir anfangen, das Projekt in der Kommandozeile zu bauen, z.B. durch einen Befehl wie diesen:

msbuild example1.sln

CMake: The ASM_NASM compiler identification is unknown

Neulich bekam ich beim Versuch, unter Ubuntu ein Makefile mit Hilfe von CMake zu erstellen, diese Fehlermeldung:

— The ASM_NASM compiler identification is unknown
— Didn’t find assembler
CMake Error at simd/CMakeLists.txt:41 (enable_language):
No CMAKE_ASM_NASM_COMPILER could be found.

Tell CMake where to find the compiler by setting either the environment
variable “ASM_NASM” or the CMake cache entry CMAKE_ASM_NASM_COMPILER to the
full path to the compiler, or to the compiler name if it is in the PATH.

— Configuring incomplete, errors occurred!

Die Lösung hier war, das Paket nasm zu installieren:

sudo apt install nasm

CMake und VS2017: could not find any instance of Visual Studio.

Vor kurzem bekam ich beim Versuch, ein Visual Studio 2017-Projekt mit CMake zu generieren, diese Fehlermeldung:

CMake Error at CMakeLists.txt:3 (project):
Generator

Visual Studio 15 2017 Win64

could not find any instance of Visual Studio.

— Configuring incomplete, errors occurred!

Die Fehlermeldung hat mich gewundert, da Visual Studio 2017 doch installiert war. Die Lösung bei mir war, dass ich noch die Komponente Visual C++ tools for CMake and Linux habe installieren müssen: