CMake Learning (4): Creación de archivos de biblioteca - Biblioteca estática/Biblioteca dinámica

A veces, el código fuente que escribimos no necesita compilarlos en programas ejecutables, sino generar algunos 静态库或动态库para uso de terceros. Expliquemos cómo generar estos dos tipos de archivos de biblioteca en cmake.

1 Hacer una biblioteca estática

En cmake, si desea hacer 静态库, el comando que debe usar es el siguiente:

add_library(库名称 STATIC 源文件1 [源文件2] ...) 

add_library生成库文件, en lugar de agregar archivos de biblioteca

  • Ya sea en Linuxo Windowsdebajo , 动态库o 静态库sus nombres se dividen principalmente en tres partes: lib++ , si es una biblioteca dinámica en Linux , está en lo siguiente ; si es una biblioteca estática, si es un sistema de Windows, 库名字el el sufijo correspondiente de la biblioteca estática es , si es el sufijo del sistema es .后缀.sowindows.dll.libLinux.a
  • 库名称: El nombre de la biblioteca sin lib y el sufijo, si es para generar una biblioteca estática, especificar como, STATICsi es una biblioteca dinámica, se especifica SHARED, seguido de todos los archivos fuente para generar archivos de biblioteca.

Hay un directorio a continuación, debe colocar srclos archivos de origen en el directorio 编译成静态库y luego usar:

.
├── build
├── CMakeLists.txt
├── include           # 头文件目录
│   └── head.h
├── main.cpp          # 用于测试的源文件
└── src               # 源文件目录
    ├── add.cpp
    ├── div.cpp
    ├── mult.cpp
    └── sub.cpp

De acuerdo con la estructura de directorios anterior, CMakeLists.txtel archivo se puede escribir así:

cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${
    
    PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(calc STATIC ${
    
    SRC_LIST})

Esto eventualmente generará el archivo de biblioteca estática correspondiente libcalc.a.

2 Hacer una biblioteca dinámica

En cmake, si desea hacer 动态库, el comando que debe usar es el siguiente:

add_library(库名称 SHARED 源文件1 [源文件2] ...) 
  • En Linux, el nombre de la biblioteca dinámica se divide en tres partes: lib+ 库名字 +.so, solo necesita especificarlo aquí 库的名字y las otras dos partes se completarán automáticamente cuando se genere el archivo.

  • En Windows, aunque el formato del nombre de la biblioteca es diferente al de Linux, solo necesita especificar el nombre.

De acuerdo con la estructura de directorios anterior, CMakeLists.txt el archivo :

cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${
    
    PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(calc SHARED ${
    
    SRC_LIST})

Esto eventualmente generará el archivo de biblioteca dinámica correspondiente libcalc.so.

3 Uso de archivos de biblioteca

两部分Cuando el archivo de la biblioteca se entrega a un tercero, los datos deben entregarse : 库文件 + 头文件porque, ya sea una biblioteca dinámica o una biblioteca estática, su esencia es la misma 源代码, pero estos códigos fuente son 二进制(para computadoras, ya sea archivos en formato binario o de texto), se procesan todos en binario), por lo que también se necesitan archivos fuente binarios 头文件, porque las declaraciones de los archivos fuente están todas definidas en archivos de encabezado.

4. Especifique la ruta del archivo de biblioteca de salida

Vía 1: para bibliotecas dinámicas

La ruta de salida se puede especificar para el archivo de biblioteca generado, así como para el programa ejecutable. Dado que hay动态库 valores predeterminados generados en Linux , puede especificar el directorio que genera de la siguiente manera:执行权限生成可执行程序

cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${
    
    PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
# 设置动态库生成路径
set(EXECUTABLE_OUTPUT_PATH ${
    
    PROJECT_SOURCE_DIR}/lib)
add_library(calc SHARED ${
    
    SRC_LIST})
  • Para este método, de hecho, se establece una ruta para EXECUTABLE_OUTPUT_PATHla macro , y esta ruta es la ruta generada por el archivo ejecutable.
  • EXECUTABLE_OUTPUT_PATHEspecifique la ruta de salida del archivo ejecutable, ya que tanto la biblioteca dinámica como el archivo ejecutable tienen permisos de ejecución, por lo que EXECUTABLE_OUTPUT_PATH también es aplicable a la biblioteca dinámica. Pero para la salida de la biblioteca dinámica, no es muy intuitivo, por lo que al especificar la ruta de salida del archivo de la biblioteca, se recomienda utilizarLIBRARY_OUTPUT_PATH

Camino 2 - ambos aplican

Dado que se genera bajo Linux 静态库默认不具有可执行权限, EXECUTABLE_OUTPUT_PATHlas macros , pero deben LIBRARY_OUTPUT_PATHusarse.Esta macro es aplicable tanto a los archivos de biblioteca estática como a los archivos de biblioteca dinámica.

cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${
    
    PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
# 设置动态库/静态库生成路径
set(LIBRARY_OUTPUT_PATH ${
    
    PROJECT_SOURCE_DIR}/lib)
# 生成动态库
#add_library(calc SHARED ${
      
      SRC_LIST})
# 生成静态库
add_library(calc STATIC ${
    
    SRC_LIST})

referencia

Autor: Su Bingyu
Enlace: https://subingwen.cn/cmake/CMake-primer/

Supongo que te gusta

Origin blog.csdn.net/weixin_38346042/article/details/131057947
Recomendado
Clasificación