Construcción y uso de biblioteca dinámica y biblioteca estática.

1. Comprender la biblioteca dinámica y la biblioteca estática

Estático, dinámico se refiere al enlace.

Los llamados estáticos y dinámicos se refieren a enlaces . Para repasar, los pasos para compilar un programa en un programa ejecutable:
Vinculación : agregue el código de la función externa (generalmente archivos con los sufijos .lib y .a) al archivo ejecutable. Esto se llama vinculación. Esta forma de agregar una biblioteca de funciones externas a un archivo ejecutable mediante la copia se denomina vinculación estática (vinculación estática) y vinculación dinámica (vinculación dinámica)

metodo de nomenclatura

En Linux:
Biblioteca estática: nombre de la biblioteca lib.a
Biblioteca dinámica: nombre de la biblioteca lib.so (objeto compartido)

Ventana: Siguiente
Biblioteca estática: nombre de la biblioteca lib.lib
Biblioteca dinámica: nombre de la biblioteca lib.dll (biblioteca de enlace dinámico)

Distingue un concepto: una biblioteca es un todo que incluye el prefijo lib y el sufijo .a o .so

El nombre de la biblioteca es la parte restante después de eliminar el prefijo y el sufijo


Características de la biblioteca dinámica y la biblioteca estática

Las características de la biblioteca estática:
1. Al usar la biblioteca estática, la información de la biblioteca estática se compilará directamente en el archivo ejecutable
2. Ventajas: cuando se elimina la biblioteca estática, no tiene efecto en el archivo ejecutable.
3. Desventaja: desperdicio de espacio de memoria. Si se modifica la biblioteca estática, el programa ejecutable debe volver a compilarse

Las características de la biblioteca dinámica:
cuando el cargador carga la biblioteca dinámica, el sistema operativo primero verificará si otros programas han cargado la biblioteca dinámica en la memoria. Si no se carga en la memoria, el sistema operativo cargará la biblioteca dinámica en la memoria y establecerá su recuento de referencias en 1; si se cargó en la memoria, solo agregará 1 al recuento de referencias de la biblioteca dinámica.

2. Cree bibliotecas dinámicas y estáticas

Directorio de proyectos

Haha.cpp solo escribe algo, como nombrar una función, imprime "jaja"

CMakeList.txt

aux_source_directory(./ SOURCES)

add_executable(example ${SOURCES})

# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2  同时得到两个软链接 具体看结果说明
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)

# 添加静态库  得到libhaha.a静态库文件
add_library(haha_static STATIC haha.cpp)
# 更改输出库的名字 libhah.a 修改为 libhello.a 
set_target_properties(haha_static PROPERTIES OUTPUT_NAME "hello")

# 设置可执行文件的输出路径 这是是工程目录下的lib目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 设置库文件的输出路径 这是是工程目录下的lib目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

Descripción del resultado

Después de ejecutar, obtendrá un directorio lib, que contiene archivos ejecutables y la biblioteca dinámica y los archivos de biblioteca estática que construimos.

Abra el directorio lib:

El archivo libhello.a es un archivo de biblioteca estática, que se puede obtener con el siguiente comando:

# 添加静态库  得到libhaha.a静态库文件
add_library(haha_static STATIC haha.cpp)
# 更改输出库的名字 libhah.a 修改为 libhello.a
set_target_properties(haha_static PROPERTIES OUTPUT_NAME "hello")

El archivo libhaha.so.1.2 es un archivo de biblioteca estática, y el enlace suave libhaha.so.1 libhaha.so, obtenido por este comando:

# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2  同时有两个链接
#  VERSION指代动态库版本, SOVERSION 指代API版本
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)

3. Usa bibliotecas dinámicas

Condiciones para el uso de bibliotecas dinámicas

Debe haber un archivo de encabezado de la biblioteca dinámica, aquí está el archivo de encabezado haha.h

Debe conocer la ruta donde se encuentra la biblioteca dinámica:

CMakeLists.txt

# 动态库所在目录
set(lib_dir "/home/jason/work/my-deploy/example/lib")

# 添加 动态库头文件 搜索路径
include_directories(./)

# 生成可执行文件
add_executable(example main.cpp)

# 链接库文件到可执行文件  库文件名称要写全
target_link_libraries(example ${lib_dir}/libhaha.so)

En mai.cpp, los archivos de encabezado de la biblioteca dinámica deben aplicarse antes de poder usar las funciones de la biblioteca dinámica.

Aquí el archivo de encabezado es haha.h, y la función de biblioteca dinámica es haha(), que imprimirá ¡jaja!

#include <iostream>
#include "haha.h"

using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    haha();
    return 0;
}

4. Usa una biblioteca estática

Usar una biblioteca estática es básicamente lo mismo que usar una biblioteca dinámica. También debe preparar la ruta donde se encuentra la biblioteca estática y el archivo de encabezado de la biblioteca estática.

CMakeLists.txt

Al vincular el archivo de la biblioteca, simplemente cámbielo al nombre de la biblioteca estática

# 静态库所在目录
set(lib_dir "/home/jason/work/my-deploy/example/lib")

# 添加 静态库头文件 搜索路径
include_directories(./)

# 生成可执行文件
add_executable(example main.cpp)

# 链接库文件到可执行文件  库文件名称要写全
target_link_libraries(example ${lib_dir}/libhello.a)

referencia:

[Cmake Actual Combat: Fanwai] Biblioteca, biblioteca dinámica y biblioteca estática (.dll, .so, .lib, .a)_cmake dll y lib_ Blog de notas de Zheng-Blog de CSDN

[cmake combat 6] Cómo usar la biblioteca compilada (dll de biblioteca dinámica)——windows system_cmake compile dynamic library_ Zheng's Notes Blog-CSDN Blog [cmake combat 5] Cómo usar la biblioteca compilada (biblioteca
estática)—— windows system_windows compile static biblioteca_Zheng notas de compañeros de clase blog-CSDN blog

 ¿Tengo que tener un archivo de encabezado para crear una biblioteca estática/biblioteca dinámica? ¿Por qué? _¿Se requiere un archivo de encabezado para usar una biblioteca estática?_Blog de comer sandía bañada en salsa picante-blog de CSDN ¿
Cuál es la diferencia entre usar una biblioteca estática y usar directamente el código fuente en C++? _La diferencia entre generar enlaces de biblioteca estáticos y compilación directa_Blog de Qianmo Yangyang-Blog de CSDN

Compilación de C++ (3)-camke/CMakeLists.txt Compilación y tutorial de uso: se busca programador

Supongo que te gusta

Origin blog.csdn.net/weixin_45824067/article/details/130803643
Recomendado
Clasificación