Conan für C++: Komplette Anleitung mit Beispielen
1. Was ist Conan und warum braucht man es?
Conan ist ein dezentraler Open-Source-Paketmanager für die Programmiersprache C++. Er löst eines der schmerzhaftesten Probleme im C++-Ökosystem: die Verwaltung von Abhängigkeiten. Im Gegensatz zu anderen Sprachen (Python mit pip, JavaScript mit npm, Rust mit Cargo) hatte C++ lange Zeit kein Standardwerkzeug zum automatischen Herunterladen, Bauen und Integrieren von Drittanbieter-Bibliotheken. Entwickler mussten Quellcode manuell herunterladen, Include-Pfade konfigurieren, Bibliotheken linken und sich mühsam mit Versionskonflikten herumschlagen. Conan automatisiert diesen gesamten Prozess.
Conan unterstützt alle gängigen Betriebssysteme (Windows, Linux, macOS) und Compiler (GCC, Clang, MSVC, MinGW). Es kann mit verschiedenen Build-Systemen arbeiten: CMake, MSBuild, Makefiles, SCons, Bazel und anderen. Pakete in Conan können sowohl als Quellcode (dann baut Conan sie für Ihre Plattform) als auch als vorgefertigte Binärdateien verteilt werden. Das spart Stunden an Zeit, besonders in großen Projekten mit Dutzenden von Abhängigkeiten.
Die wichtigste Funktion von Conan ist das Profil-Modell. Sie können ein Profil für jede Plattform/jeden Compiler definieren (z.B. "clang-14-release-x86_64" oder "msvc-2022-debug-x86"). Conan wählt automatisch Pakete aus oder baut sie, die zu Ihrem Profil passen. Das macht es zu einem unverzichtbaren Werkzeug für plattformübergreifende Entwicklung und CI/CD-Pipelines.
2. Installation
Conan ist in Python geschrieben und wird über pip installiert. Es wird empfohlen, es in einer virtuellen Umgebung (venv) zu installieren, um Konflikte mit System-Python-Paketen zu vermeiden.
# Installation über pip (empfohlen in einer virtuellen Umgebung)
python -m pip install conan
# Installation überprüfen
conan --version
# Update auf die neueste Version
python -m pip install --upgrade conan
Nach der Installation sollten Sie sofort das Standard-Remote-Repository (Remote) einrichten – ConanCenter. Es ist standardmäßig bereits hinzugefügt, aber Sie können dies mit folgendem Befehl überprüfen:
conan remote list
Wenn ConanCenter fehlt, fügen Sie es hinzu:
conan remote add conancenter https://center.conan.io
3. Schnellstart – Minimales funktionierendes Beispiel
Erstellen wir ein einfaches Projekt, das die Bibliotheken fmtlib (String-Formatierung) und zlib (Datenkompression) verwendet.
Schritt 1: Projektstruktur
mkdir my_conan_project
cd my_conan_project
mkdir src
Schritt 2: Datei conanfile.txt
[requires]
fmt/10.2.1
zlib/1.3.1
[generators]
CMakeDeps
CMakeToolchain
[layout]
cmake_layout
Schritt 3: CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(MyConanProject CXX)
find_package(fmt REQUIRED)
find_package(ZLIB REQUIRED)
add_executable(my_app src/main.cpp)
target_link_libraries(my_app PRIVATE fmt::fmt ZLIB::ZLIB)
Schritt 4: src/main.cpp
#include <fmt/core.h>
#include <zlib.h>
#include <iostream>
int main() {
// Verwendung von fmt
fmt::print("Hallo von Conan! Version: {}\n", FMT_VERSION);
// Verwendung von zlib
std::cout << "zlib-Version: " << zlibVersion() << std::endl;
// Einfaches Kompressionsbeispiel
const char* data = "Hallo, Conan! Dieser String wird komprimiert.";
uLong source_len = strlen(data) + 1;
uLong dest_len = compressBound(source_len);
char* compressed = new char[dest_len];
int ret = compress(reinterpret_cast(compressed), &dest_len,
reinterpret_cast(data), source_len);
if (ret == Z_OK) {
fmt::print("Komprimierung erfolgreich! Original: {} Bytes -> Komprimiert: {} Bytes\n", source_len, dest_len);
} else {
fmt::print("Fehler bei der Komprimierung: {}\n", ret);
}
delete[] compressed;
return 0;
}
Schritt 5: Projekt bauen und ausführen
# Abhängigkeiten installieren
conan install . --build=missing
# Build-Verzeichnis konfigurieren und bauen
cmake --preset conan-default
cmake --build --preset conan-release
# Ausführen
./build/Release/my_app
Ausgabe:
Hallo von Conan! Version: 100201
zlib-Version: 1.3.1
Komprimierung erfolgreich! Original: 53 Bytes -> Komprimiert: 39 Bytes
4. Wichtige Conan-Methoden und -Befehle
4.1 Pakete suchen
# Nach einem Paket suchen
conan search "fmt" --remote=conancenter
# Alle verfügbaren Versionen eines Pakets anzeigen
conan search fmt/* --remote=conancenter
4.2 Paketinformationen anzeigen
# Details zu einem Paket anzeigen
conan inspect fmt/10.2.1
# Abhängigkeiten eines Pakets anzeigen
conan info fmt/10.2.1
4.3 Pakete erstellen und veröffentlichen
# Ein Paket aus dem Quellcode erstellen
conan create . --version=1.0.0
# Ein Paket in ein Remote-Repository hochladen
conan upload mypackage/1.0.0 --remote=myremote
4.4 Profile verwalten
# Vorhandene Profile anzeigen
conan profile list
# Ein neues Profil erstellen
conan profile detect --name=myprofile
# Ein Profil bearbeiten
conan profile update settings.compiler=gcc myprofile
5. Fortgeschrittene Techniken
5.1 Mit conanfile.py arbeiten
Für komplexere Projekte verwenden Sie eine conanfile.py anstelle einer conanfile.txt. Dies gibt Ihnen mehr Kontrolle über den Build-Prozess:
from conan import ConanFile
class MyProjectConan(ConanFile):
name = "my_project"
version = "1.0.0"
settings = "os", "compiler", "build_type", "arch"
requires = "fmt/10.2.1", "zlib/1.3.1"
generators = "CMakeDeps", "CMakeToolchain"
def layout(self):
cmake_layout(self)
def package_info(self):
self.cpp_info.libs = ["my_lib"]
5.2 Optionen und Konfigurationen
Sie können Paketoptionen in Ihrer conanfile.txt oder conanfile.py festlegen:
[requires]
poco/1.12.4
[options]
poco:shared=True
poco:enable_zip=False
5.3 Mit mehreren Remotes arbeiten
# Ein weiteres Remote-Repository hinzufügen
conan remote add mycompany https://conan.mycompany.com
# Pakete von einem bestimmten Remote installieren
conan install . --remote=mycompany
6. Fazit
Conan ist der führende Paketmanager für C++ und ein unverzichtbares Werkzeug für moderne C++-Entwicklung. Es automatisiert die Verwaltung von Abhängigkeiten, spart Zeit und reduziert Fehler. Mit seiner Unterstützung für verschiedene Plattformen, Compiler und Build-Systeme ist es ideal für sowohl kleine als auch große Projekte. Beginnen Sie noch heute mit Conan und erleben Sie, wie einfach C++-Abhängigkeitsmanagement sein kann!
Auch in der Bibliothek
Arbeiten mit CSV in Go (Golang): Vollständige Anleitung zum Parsen und Schreiben
Arbeiten mit ZIP/Archiven in TypeScript: vollständige Anleitung zu JSZip und adm-zip
FluentValidation für C# (.NET): Vollständige Anleitung mit Beispielen
Aufgabenwarteschlangen in Kotlin: Coroutines, Flow und Bibliotheken für die Hintergrundverarbeitung