He escrito una biblioteca que solía compilar usando un Makefile auto escrito, pero ahora quiero cambiar a cmake. El árbol se ve así (eliminé todos los archivos irrelevantes):
.
├── include
│ ├── animation.h
│ ├── buffers.h
│ ├── ...
│ ├── vertex.h
│ └── world.h
└── src
├── animation.cpp
├── buffers.cpp
├── ...
├── vertex.cpp
└── world.cpp
Entonces, lo que intento hacer es compilar la fuente en una biblioteca compartida y luego instalarla con los archivos de encabezado.
La mayoría de los ejemplos que he encontrado compilan ejecutables con algunas bibliotecas compartidas, pero nunca solo una biblioteca compartida simple. También sería útil si alguien pudiera decirme una biblioteca muy simple que usa cmake, para que yo pueda usar esto como un ejemplo.
c++
compilation
cmake
shared-libraries
Florian M
fuente
fuente
Respuestas:
Especifique siempre la versión mínima requerida de
cmake
Deberías declarar un proyecto.
cmake
dice que es obligatorio y definirá variables convenientesPROJECT_NAME
,PROJECT_VERSION
yPROJECT_DESCRIPTION
(esta última variable necesita cmake 3.9):Declarar un nuevo objetivo de biblioteca. Por favor, evite el uso de
file(GLOB ...)
. Esta característica no proporciona dominio asistido del proceso de compilación. Si eres flojo, copia y pega la salida dels -1 sources/*.cpp
:Establecer
VERSION
propiedad (opcional pero es una buena práctica):También puede establecer
SOVERSION
un número mayor deVERSION
. Entonceslibmylib.so.1
será un enlace simbólico alibmylib.so.1.0.0
.Declara la API pública de tu biblioteca. Esta API se instalará para la aplicación de terceros. Es una buena práctica aislarlo en su árbol de proyecto (como colocarlo en el
include/
directorio). Tenga en cuenta que no se deben instalar encabezados privados y le sugiero que los coloque con los archivos de origen.Si trabaja con subdirectorios, no es muy conveniente incluir rutas relativas como
"../include/mylib.h"
. Entonces, pase un directorio superior en los directorios incluidos:o
Cree una regla de instalación para su biblioteca. Sugiero usar variables
CMAKE_INSTALL_*DIR
definidas enGNUInstallDirs
:Y declarar archivos para instalar:
También puede exportar un
pkg-config
archivo. Este archivo permite que una aplicación de terceros importe fácilmente su biblioteca:pkg-config
PKG_CHECK_MODULES
pkg_check_modules
Crear un archivo de plantilla llamada
mylib.pc.in
(ver PC (5) página de manual para más información):En su
CMakeLists.txt
, agregue una regla para expandir las@
macros (@ONLY
solicite cmake para no expandir las variables del formulario${VAR}
):Y finalmente, instale el archivo generado:
También puede usar la función cmake
EXPORT
. Sin embargo, esta función solo es compatiblecmake
y me resulta difícil de usar.Finalmente todo
CMakeLists.txt
debería verse así:fuente
mkdir build && cd build/ && cmake .. && sudo make install
(osudo make install/strip
para instalar la versión de biblioteca rayada )..pc
archivo, agregueRequires: liblog4cxx
a sumylib.pc
, de lo contrario, sólo puede añadir-llog4cxx
aLibs:
.Este
CMakeLists.txt
archivo mínimo compila una biblioteca compartida simple:Sin embargo, no tengo experiencia copiando archivos a un destino diferente con CMake. Parece que el comando de archivo con la firma COPY / INSTALL podría ser útil.
fuente
${CMAKE_CURRENT_SOURCE_DIR}/
eninclude_directories
es útil?Estoy tratando de aprender cómo hacerlo yo mismo, y parece que puedes instalar la biblioteca de esta manera:
fuente
Primero, este es el diseño del directorio que estoy usando:
Después de un par de días analizando esto, esta es mi forma favorita de hacerlo gracias a CMake moderno:
Después de ejecutar CMake e instalar la biblioteca, no es necesario usar los archivos Find ***. Cmake, se puede usar así:
Eso es todo, si se ha instalado en un directorio estándar, se encontrará y no hay necesidad de hacer nada más. Si se ha instalado en una ruta no estándar, también es fácil, solo dígale a CMake dónde encontrar MyLibConfig.cmake usando:
Espero que esto ayude a todos tanto como me ha ayudado a mí. Las viejas formas de hacer esto eran bastante engorrosas.
fuente