Ich habe eine Bibliothek geschrieben, die ich mit einem selbstgeschriebenen Makefile kompiliert habe, aber jetzt möchte ich zu cmake wechseln. Der Baum sieht folgendermaßen aus (ich habe alle irrelevanten Dateien entfernt):
.
├── include
│ ├── animation.h
│ ├── buffers.h
│ ├── ...
│ ├── vertex.h
│ └── world.h
└── src
├── animation.cpp
├── buffers.cpp
├── ...
├── vertex.cpp
└── world.cpp
Ich versuche also, die Quelle in eine gemeinsam genutzte Bibliothek zu kompilieren und sie dann mit den Header-Dateien zu installieren.
Die meisten Beispiele, die ich gefunden habe, kompilieren ausführbare Dateien mit einigen gemeinsam genutzten Bibliotheken, aber niemals nur mit einer einfachen gemeinsam genutzten Bibliothek. Es wäre auch hilfreich, wenn mir jemand eine sehr einfache Bibliothek nennen könnte, die cmake verwendet, damit ich dies als Beispiel verwenden kann.
c++
compilation
cmake
shared-libraries
Florian M.
quelle
quelle
Antworten:
Geben Sie immer die minimal erforderliche Version von an
cmake
Sie sollten ein Projekt deklarieren.
cmake
sagt, dass es obligatorisch ist und bequeme Variablen definiertPROJECT_NAME
,PROJECT_VERSION
undPROJECT_DESCRIPTION
(diese letztere Variable erfordert cmake 3.9):Deklarieren Sie ein neues Bibliotheksziel. Bitte vermeiden Sie die Verwendung von
file(GLOB ...)
. Diese Funktion bietet keine kontrollierte Beherrschung des Kompilierungsprozesses. Wenn Sie faul sind, kopieren Sie die Ausgabe vonls -1 sources/*.cpp
:VERSION
Eigenschaft festlegen (optional, aber eine gute Vorgehensweise):Sie können auch
SOVERSION
eine große Anzahl von einstellenVERSION
. Alsolibmylib.so.1
wird ein Symlink zulibmylib.so.1.0.0
.Deklarieren Sie die öffentliche API Ihrer Bibliothek. Diese API wird für die Drittanbieteranwendung installiert. Es wird empfohlen, es in Ihrem Projektbaum zu isolieren (z. B. im
include/
Verzeichnis zu platzieren). Beachten Sie, dass private Header nicht installiert werden sollten, und ich empfehle dringend, sie zusammen mit den Quelldateien zu platzieren.Wenn Sie mit Unterverzeichnissen arbeiten, ist es nicht sehr praktisch, relative Pfade wie einzuschließen
"../include/mylib.h"
. Übergeben Sie also ein Top-Verzeichnis in den enthaltenen Verzeichnissen:oder
Erstellen Sie eine Installationsregel für Ihre Bibliothek. Ich schlage vor, Variablen zu verwenden, die
CMAKE_INSTALL_*DIR
definiert sind inGNUInstallDirs
:Und deklarieren Sie die zu installierenden Dateien:
Sie können auch eine
pkg-config
Datei exportieren . Mit dieser Datei kann eine Drittanbieteranwendung Ihre Bibliothek problemlos importieren:pkg-config
PKG_CHECK_MODULES
pkg_check_modules
Erstellen Sie eine Vorlagendatei mit dem Namen
mylib.pc.in
( weitere Informationen finden Sie in der Manpage zu PC (5) ):Fügen Sie in Ihrem
CMakeLists.txt
eine Regel hinzu, um@
Makros zu erweitern (@ONLY
fragen Sie cmake, um Variablen des Formulars nicht zu erweitern${VAR}
):Und schließlich installieren Sie die generierte Datei:
Sie können auch die cmake-
EXPORT
Funktion verwenden . Diese Funktion ist jedoch nur mit kompatibelcmake
und ich finde es schwierig, sie zu verwenden.Schließlich
CMakeLists.txt
sollte das Ganze so aussehen:quelle
mkdir build && cd build/ && cmake .. && sudo make install
(odersudo make install/strip
die gestreifte Bibliotheksversion installieren )..pc
Datei, fügen SieRequires: liblog4cxx
zu Ihremmylib.pc
, sonst können Sie fügen Sie einfach-llog4cxx
aufLibs:
.Diese minimale
CMakeLists.txt
Datei kompiliert eine einfache gemeinsam genutzte Bibliothek:Ich habe jedoch keine Erfahrung damit, Dateien mit CMake an ein anderes Ziel zu kopieren. Der Befehl file mit der Signatur COPY / INSTALL scheint nützlich zu sein.
quelle
${CMAKE_CURRENT_SOURCE_DIR}/
ininclude_directories
nützlich?Ich versuche selbst zu lernen, wie das geht, und anscheinend können Sie die Bibliothek folgendermaßen installieren:
quelle
Erstens ist dies das Verzeichnislayout, das ich verwende:
Nach ein paar Tagen, in denen ich mir das anschaue, ist dies dank des modernen CMake meine Lieblingsmethode:
Nachdem Sie CMake ausgeführt und die Bibliothek installiert haben, müssen Sie keine Find ***. Cmake-Dateien verwenden. Sie können folgendermaßen verwendet werden:
Das war's, wenn es in einem Standardverzeichnis installiert wurde, wird es gefunden und es besteht keine Notwendigkeit, etwas anderes zu tun. Wenn es in einem nicht standardmäßigen Pfad installiert wurde, ist es auch einfach. Teilen Sie CMake einfach mit, wo sich MyLibConfig.cmake befindet, indem Sie:
Ich hoffe, das hilft allen so sehr, wie es mir geholfen hat. Alte Methoden waren ziemlich umständlich.
quelle