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.cppEntonces, 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
cmakeDeberías declarar un proyecto.
cmakedice que es obligatorio y definirá variables convenientesPROJECT_NAME,PROJECT_VERSIONyPROJECT_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
VERSIONpropiedad (opcional pero es una buena práctica):También puede establecer
SOVERSIONun número mayor deVERSION. Entonceslibmylib.so.1será 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_*DIRdefinidas enGNUInstallDirs:Y declarar archivos para instalar:
También puede exportar un
pkg-configarchivo. Este archivo permite que una aplicación de terceros importe fácilmente su biblioteca:pkg-configPKG_CHECK_MODULESpkg_check_modulesCrear 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 (@ONLYsolicite 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 compatiblecmakey me resulta difícil de usar.Finalmente todo
CMakeLists.txtdebería verse así:fuente
mkdir build && cd build/ && cmake .. && sudo make install(osudo make install/strippara instalar la versión de biblioteca rayada )..pcarchivo, agregueRequires: liblog4cxxa sumylib.pc, de lo contrario, sólo puede añadir-llog4cxxaLibs:.Este
CMakeLists.txtarchivo 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_directorieses ú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