Sie haben ein CMake-fähiges Bibliotheksprojekt. Sie müssen es in einer anderen Bibliothek oder ausführbaren Datei verwenden. Wie benutzt man CMake um die Bibliothek zu finden und zu verlinken? Sie haben möglicherweise folgende Einstellungen:
Idealerweise sollte die Verwendung der Bibliothek wie folgt aussehen:
%Vor%Lassen Sie mich eine mögliche Lösung an einem konkreten Beispiel zeigen:
myapp
-Projekt Wir haben ein ausführbares Ziel myapp
. Wir verknüpfen es mit mylib
, das in einer eigenen Build-Struktur erstellt wird. In CMakeLists.txt
von myapp
finden und spezifizieren wir mylib
als eine Abhängigkeit von myexe
:
Sehen wir uns an, wie Sie mylib
und das Build von myexe
einrichten, damit dies funktioniert.
mylib
-Projekt Das Verzeichnislayout von mylib
:
In CMakeLists.txt
von mylib
müssen wir das Ziel erstellen und seine Quelldateien angeben:
Der öffentliche Header mylib.h
wird als #include "mylib.h"
sowohl von mylib
als auch von den Clients von mylib
:
mylib
selbst und andere Ziele, die im CMake-Projekt von mylib
erstellt wurden (z. B. Tests), müssen include/mylib.h
aus der mylib
-Source-Struktur mylib
, die in ihren eigenen Projekten (wie myexe
) erstellt wurden, müssen include/mylib.h
an ihrem installierten Speicherort finden CMake ermöglicht es uns, beide Include-Pfade für mylib
:
Wir verwenden hier die Option PUBLIC
, da dieser Header auf der öffentlichen Schnittstelle von mylib
benötigt wird. Verwenden Sie PRIVATE
für Include-Pfade, die in mylib
enthalten sind.
INSTALL_INTERFACE
gibt einen Pfad relativ zum Installationsstammverzeichnis an, also CMAKE_INSTALL_PREFIX
. Um den öffentlichen Header tatsächlich zu installieren:
Wir müssen auch die Bibliothek selbst und das so genannte Config-Modul und zugehörige Dateien installieren. Das config-Modul ist die Datei, die von konsumierenden Projekten verwendet wird, wie myapp
, um mylib
zu finden und alle Parameter zu erhalten, die benötigt werden, um eine Verbindung herzustellen. Es ähnelt den .pc
-Dateien von pkg-config .
Wir brauchen zwei verwandte install
-Befehle. Der erste:
Die Liste der Ziele, die benötigt werden, um alle Standardinstallationsorte der statischen Bibliotheken zu umfassen, dll
's und so
' s. Wenn Sie sicher sind, dass Ihre Bibliothek ausschließlich als statische Bibliothek erstellt wird, würde ein einzelnes DESTINATION lib
es schaffen.
Der interessante Teil ist die Option EXPORT
. Er weist die Liste der Ziele (derzeit ist es nur mylib
) dem Bezeichner mylib-targets
zu. Dieser Bezeichner wird im nächsten Befehl verwendet, um einige spezielle Dateien zu generieren und zu installieren, die find_package(mylib)
in den konsumierenden Projekten arbeiten lassen:
Dieser Befehl erzeugt mehrere Dateien:
mylib-config.cmake
um.
Die Dateien werden in ${CMAKE_INSTALL_PREFIX}/lib/cmake/mylib
installiert. Dies ist einer der vielen Standardspeicherorte, nach denen der Befehl find_package(mylib)
sucht mylib-config.cmake
.
mylib
Wir müssen einen Installationsort in der Variablen CMAKE_INSTALL_PREFIX
angeben:
und erstellen und installieren Sie die Bibliothek:
%Vor%myexe
myexe
muss wissen, wo nach mylib
gesucht werden soll. Die Variable CMAKE_PREFIX_PATH
kann eine Liste von Pfaden sein. Wir müssen den vorherigen Installationsort angeben:
Normalerweise müssen wir mehrere Konfigurationen erstellen ( Debug
, Release
). Ein kritisches Problem besteht darin, konfigurationsabhängige Dateinamen oder Installationsorte anzugeben. Sie können beispielsweise den Standardwert der Eigenschaft DEBUG_POSTFIX
für das Bibliotheksprojekt festlegen:
Die Debug-Version der mylib
-Bibliotheksdatei heißt libmylibd.lib
(oder mylibd.lib
unter Windows). Die generierten EXPORT
Dateien enthalten die modifizierten Dateinamen.
Wenn Sie CMake-Generatoren im Makefile-Stil verwenden, können Sie die Build-Konfiguration steuern, indem Sie die Variable CMAKE_BUILD_TYPE
setzen:
Sie benötigen möglicherweise separate Build-Verzeichnisse für jede Konfiguration oder Sie können dasselbe Build-Verzeichnis verwenden. In diesem Fall ist es am besten, vor dem Build explizit zu säubern:
%Vor% Wenn Sie einen Multiconfig-IDE-Generator wie Xcode
oder Visual Studio
verwenden, müssen Sie die Konfiguration in Build-Zeit angeben:
Sie können dieses Repository klonen und erstellen , das die mylib
und myexe
enthält. Projekte (getestet unter Windows und Linux).
Sehen Sie sich die CMake-Dokumentation an. Die wichtigsten verwandten Befehle sind:
und zwei ausführliche Artikel:
Tags und Links cmake