Wie benutze ich CMake, um mit install-export und find_package nach einer Bibliothek zu suchen und sie mit ihr zu verknüpfen?

8

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:

  • schreiben Sie die geringstmögliche Menge an Code für die Kesselplatte
  • Entkoppeln Sie die internen Details der verknüpften Bibliothek vom konsumierenden Ziel

Idealerweise sollte die Verwendung der Bibliothek wie folgt aussehen:

%Vor%     
tamas.kenez 21.07.2015, 11:19
quelle

1 Antwort

19

Lassen Sie mich eine mögliche Lösung an einem konkreten Beispiel zeigen:

Das 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 :

%Vor%

Sehen wir uns an, wie Sie mylib und das Build von myexe einrichten, damit dies funktioniert.

Das mylib -Projekt

Das Verzeichnislayout von mylib :

%Vor%

In CMakeLists.txt von mylib müssen wir das Ziel erstellen und seine Quelldateien angeben:

%Vor%

Der öffentliche Header mylib.h wird als #include "mylib.h" sowohl von mylib als auch von den Clients von mylib :

eingefügt
  • 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
  • finden
  • Clients von 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 :

anzugeben %Vor%

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:

%Vor%

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:

%Vor%

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:

%Vor%

Dieser Befehl erzeugt mehrere Dateien:

  • eine Datei für jede Erstellungskonfiguration (Debug, Release usw.), die die Bibliotheksdatei und die konfigurationsabhängigen Parameter
  • beschreibt
  • eine Datei, die die konfigurationsunabhängigen Parameter beschreibt und auch alle von der Konfiguration abhängigen Dateien enthält. Da diese Datei auch alleine als Config-Modul verwendet werden kann, benennen wir sie einfach in 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 .

Gebäude mylib

Wir müssen einen Installationsort in der Variablen CMAKE_INSTALL_PREFIX angeben:

%Vor%

und erstellen und installieren Sie die Bibliothek:

%Vor%

Gebäude 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:

%Vor%

Eine Anmerkung zum Aufbau mehrerer Konfigurationen

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:

%Vor%

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:

%Vor%

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:

%Vor%

Referenzen

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:

tamas.kenez 21.07.2015 11:19
quelle

Tags und Links