J'ai écrit une bibliothèque que j'avais l'habitude de compiler en utilisant un Makefile auto-écrit, mais maintenant je veux passer à cmake. L'arbre ressemble à ceci (j'ai supprimé tous les fichiers non pertinents):
.
├── include
│ ├── animation.h
│ ├── buffers.h
│ ├── ...
│ ├── vertex.h
│ └── world.h
└── src
├── animation.cpp
├── buffers.cpp
├── ...
├── vertex.cpp
└── world.cpp
Donc, ce que j'essaie de faire, c'est simplement de compiler la source dans une bibliothèque partagée, puis de l'installer avec les fichiers d'en-tête.
La plupart des exemples que j'ai trouvés compilent des exécutables avec certaines bibliothèques partagées mais jamais simplement une bibliothèque partagée. Ce serait également utile si quelqu'un pouvait simplement me dire une bibliothèque très simple qui utilise cmake, afin que je puisse l'utiliser comme exemple.
c++
compilation
cmake
shared-libraries
Florian M
la source
la source
Réponses:
Spécifiez toujours la version minimale requise de
cmake
Vous devez déclarer un projet.
cmake
dit que c'est obligatoire et qu'il définira des variables pratiquesPROJECT_NAME
,PROJECT_VERSION
etPROJECT_DESCRIPTION
(cette dernière variable nécessite cmake 3.9):Déclarez une nouvelle cible de bibliothèque. Veuillez éviter l'utilisation de
file(GLOB ...)
. Cette fonctionnalité ne permet pas une maîtrise assistée du processus de compilation. Si vous êtes paresseux, copiez-collez la sortie dels -1 sources/*.cpp
:Définir la
VERSION
propriété (facultatif mais c'est une bonne pratique):Vous pouvez également définir
SOVERSION
un nombre majeur deVERSION
. Celibmylib.so.1
sera donc un lien symbolique verslibmylib.so.1.0.0
.Déclarez l'API publique de votre bibliothèque. Cette API sera installée pour l'application tierce. Il est recommandé de l'isoler dans l'arborescence de votre projet (comme en le plaçant dans le
include/
répertoire). Notez que les en-têtes privés ne doivent pas être installés et je suggère fortement de les placer avec les fichiers source.Si vous travaillez avec des sous-répertoires, il n'est pas très pratique d'inclure des chemins relatifs comme
"../include/mylib.h"
. Alors, passez un répertoire supérieur dans les répertoires inclus:ou
Créez une règle d'installation pour votre bibliothèque. Je suggère d'utiliser des variables
CMAKE_INSTALL_*DIR
définies dansGNUInstallDirs
:Et déclarez les fichiers à installer:
Vous pouvez également exporter un
pkg-config
fichier. Ce fichier permet à une application tierce d'importer facilement votre bibliothèque:pkg-config
PKG_CHECK_MODULES
pkg_check_modules
Créez un fichier modèle nommé
mylib.pc.in
(voir la page de manuel pc (5) pour plus d'informations):Dans votre
CMakeLists.txt
, ajoutez une règle pour développer les@
macros (@ONLY
demandez à cmake de ne pas développer les variables du formulaire${VAR}
):Et enfin, installez le fichier généré:
Vous pouvez également utiliser la fonction cmake
EXPORT
. Cependant, cette fonctionnalité n'est compatible qu'aveccmake
et je trouve difficile à utiliser.Enfin l'ensemble
CMakeLists.txt
devrait ressembler à:la source
mkdir build && cd build/ && cmake .. && sudo make install
(ousudo make install/strip
pour installer la version de la bibliothèque par bandes )..pc
fichier, ajoutez-leRequires: liblog4cxx
à votremylib.pc
, sinon, vous pouvez simplement ajouter-llog4cxx
àLibs:
.Ce
CMakeLists.txt
fichier minimal compile une bibliothèque partagée simple:Cependant, je n'ai aucune expérience de copie de fichiers vers une destination différente avec CMake. La commande de fichier avec la signature COPY / INSTALL semble être utile.
la source
${CMAKE_CURRENT_SOURCE_DIR}/
dansinclude_directories
est utile?J'essaie d'apprendre à faire cela moi-même, et il semble que vous pouvez installer la bibliothèque comme ceci:
la source
Tout d'abord, voici la disposition du répertoire que j'utilise:
Après quelques jours à y jeter un coup d'œil, voici ma façon préférée de le faire grâce à CMake moderne:
Après avoir exécuté CMake et installé la bibliothèque, il n'est pas nécessaire d'utiliser les fichiers Find ***. Cmake, il peut être utilisé comme ceci:
Voilà, s'il a été installé dans un répertoire standard, il sera trouvé et il n'y a rien d'autre à faire. S'il a été installé dans un chemin non standard, c'est également facile, dites simplement à CMake où trouver MyLibConfig.cmake en utilisant:
J'espère que cela aide tout le monde autant que cela m'a aidé. Les anciennes méthodes étaient assez lourdes.
la source