Paketbaurichtlinien für C und C++
Einführung
Die Programmiersprachen C und C++ sowie deren Laufzeitumgebungen gehören zu den gängigsten Entwicklungsframeworks für Pakete in Fedora. Daher gibt es große Unterschiede hinsichtlich Qualität, Stil und Konventionen in den jeweiligen Paketen. Das folgende Dokument zeigt Ihnen bewährte Vorgehensweisen für bestimmte Aspekte der Paketierung von C- und C++-Paketen.
Paketierung
BuildRequires und Requires
Wenn Ihre Anwendung in C oder C++ geschrieben ist, müssen Sie in BuildRequires die Pakete gcc, gcc-c++ oder clang angeben. Diese Pakete enthalten alles, was zum Erstellen einer standardkonformen C- oder C++-Anwendung benötigt wird.
Wenn Ihre Bibliothek Standard-C- oder C++-Header enthält, müssen Sie BuildRequires für gcc, gcc-c++ oder clang auflisten, um die benötigten standardkonformen Header zu installieren.
Wenn Sie zur Laufzeit cpp verwenden, um C- oder C++-Sprachheader zu verarbeiten, müssen Sie Requires für gcc, gcc-c++ oder clang verwenden, um die benötigten Header für eine standardkonforme C- oder C++-Anwendung zu installieren. Dies könnte sich in Zukunft ändern, falls spezielle Anbieter wie z. B. c-headers oder c++-headers einen Satz standardkonformer C- oder C++-Sprachheader bereitstellen.
Wenn Sie zur Laufzeit cpp verwenden, um C- oder C++-Sprachheader zu verarbeiten, müssen Sie BuildRequires oder Requires für `gcc, gcc-c++ oder clang verwenden, um den benötigten Header für eine standardkonforme C- oder C++-Anwendung zu installieren. Dies könnte sich in Zukunft ändern, falls spezielle Anbieter wie z. B. c-headers oder c++-headers einen Satz standardkonformer C- oder C++-Sprachheader bereitstellen.
Eine Liste der unterstützten Compiler für C und C++ finden Sie in den Compiler-Richtlinien.
Fragen und Antworten zur Paketierung
-
Benötige ich
Requires: glibc, um sicherzustellen, dass die C-Laufzeitumgebung für meine Anwendung installiert ist?Nein. RPM ermittelt automatisch die benötigten ELF-Bibliotheken anhand der Binärdateien in Ihrem Paket. Dies reicht für die Installation von glibc aus.
-
Benötige ich
Requires: libgcc?Wenn Sie eine API von
libgccdirekt verwenden, benötigen Sie die ZeileRequires: libgcc. Im Allgemeinen benötigtglibcjedochlibgcc, daher ist es immer installiert.
Bibliotheken
Bibliotheken sollten eindeutige Shared-Object-Namen (SONAMEs über -Wl,-soname=libfoo.so) besitzen, die nicht mit anderen in der Distribution verwendeten Bibliotheks-SONAMEs kollidieren. Beispielsweise sollte es nur eine libfoo.so in der Distribution geben. Eine Ausnahme besteht, wenn mehrere Implementierungen derselben Bibliothek libfoo.so von verschiedenen Autoren bereitgestellt werden und diese miteinander in Konflikt stehen. In diesem Fall müssen beide libfoo.so exakt dieselbe Schnittstelle, jedoch mit unterschiedlicher Implementierung, bereitstellen. Zwei libfoo.so mit jeweils unterschiedlicher API zu verwenden, ist schlechte Praxis und erschwert das Paketieren und Verteilen.
Bibliotheken sollten alle ihre Symbole mithilfe eines Versionsskripts versionieren. Die Versionierung ermöglicht es der Bibliothek, die Änderung des SONAME bei API-Änderungen zu vermeiden und stattdessen Kompatibilitätsfunktionen zu schreiben, um die Abwärtskompatibilität für ältere Anwendungen zu gewährleisten.
Want to help? Learn how to contribute to Fedora Docs ›