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
Sí 生成库文件
, en lugar de agregar archivos de biblioteca
- Ya sea en
Linux
oWindows
debajo ,动态库
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 .后缀
.so
windows
.dll
.lib
Linux
.a
库名称
: El nombre de la biblioteca sin lib y el sufijo, si es para generar una biblioteca estática, especificar como,STATIC
si es una biblioteca dinámica, se especificaSHARED
, seguido de todos los archivos fuente para generar archivos de biblioteca.
Hay un directorio a continuación, debe colocar src
los 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.txt
el 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_PATH
la macro , y esta ruta es la ruta generada por el archivo ejecutable. EXECUTABLE_OUTPUT_PATH
Especifique 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_PATH
las macros , pero deben LIBRARY_OUTPUT_PATH
usarse.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/