Archivos de biblioteca de C++ y las características de los archivos de biblioteca dinámicos

archivo de biblioteca C++

Biblioteca estática de Windows: .lib

Contiene dos archivos testlib.lib y testlib.h. Al escribir un programa para llamar a las funciones contenidas en la biblioteca estática, la implementación de la función se colocó en el archivo exe generado después de la compilación, por lo que la operación posterior del exe no necesita confiar en la biblioteca estática, el costo es que el tamaño del exe será más grande. En la actualidad, los programas principales generalmente no usan bibliotecas estáticas.
inserte la descripción de la imagen aquí

Biblioteca dinámica de Windows: .dll

Contiene dos archivos, testlib.lib (requerido en la etapa de compilación) y testlib.dll (usado en la etapa de llamada y ejecución).Al escribir un programa para llamar a las funciones contenidas en la biblioteca dinámica, la etapa de compilación solo pone la información de reubicación de la función en el archivo exe In, por lo que la operación posterior del exe necesita confiar en la biblioteca dinámica. Vale la pena mencionar que, aunque tanto las bibliotecas dinámicas como las estáticas tienen un archivo .lib, son completamente diferentes. El archivo .lib de la biblioteca dinámica solo se necesita en la fase de compilación de su llamada, y el .dll solo se necesita en la fase de tiempo de ejecución de la llamada.
inserte la descripción de la imagen aquí

Biblioteca dinámica de Linux: libXXX.so

Al igual que la biblioteca dinámica de Windows, el nombre es el anterior.

Biblioteca estática de Linux: LibXXX.a

compilar biblioteca

Biblioteca estática de Windows

├─static_lib.cpp
├─static_lib.h
├─pch.cpp #Estos dos son encabezados precompilados generados por el mismo vc++, aquí no prestamos atención a
└─pch.h #Estos dos son encabezados precompilados generados por el mismo vc++ Head , no prestamos atención aquí

#include "pch.h"
#include "static_lib.h"
int add(int x, int y)
{
    
    
	return x + y;
}

#pragma once
int add(int x, int y);

Una vez completada la compilación, obtenga el archivo static_lib.lib en la carpeta DEBUG y agregue un static_lib.h recién usado.Con estos dos archivos, puede llamar a la función agregar y el proceso de llamada seguirá.

Biblioteca dinámica de Windows

├─dynamic_lib.cpp
├─dynamic_lib.h
├─pch.cpp #Estos dos son encabezados precompilados generados por el mismo vc++, no prestamos atención aquí└─pch.h
#Estos dos son encabezados precompilados generados por el mismo vc++ Head, aquí no prestamos atención

#include "pch.h"
#include "dynamic_lib.h"
#define  DLL_API _declspec(dllexport)
DLL_API int add(int a, int b)   //实现两个整数相加
{
    
    
	return a + b;
}

#pragma once
#define  DLL_API _declspec(dllexport)
int add(int x, int y);

Después de compilar, se generarán dos archivos dynamic_lib.dll y dynamic_lib.lib en DEBUG

Biblioteca estática de Linux

├─static_lib.c
└─static_lib.h

#include "static_lib.h"
int add(int a, int b)
{
    
    
	int c;
	c = a + b;
	return c ;
}

#pragma onece
int add(int a, int b);

El proceso de compilación se divide en dos pasos, primero generar archivos .o y luego archivarlos como .a archivos de biblioteca estática de acuerdo con los archivos .o
1, gcc -c static_lib.c
y luego archivarlos como archivos de biblioteca estática, generando así la biblioteca estática libstatic_lib.a
2, ar crv libstatic_lib.a static_lib.o

Biblioteca dinámica de Linux

├─dynamic_lib.c
└─dynamic_lib.h

#include "dynamic_lib.h"
int add(int a, int b)
{
    
    
	int c;
	c = a + b;
	return c ;
}
#pragma onece
int add(int a, int b);


Compile y genere el archivo .so, ingrese ~$ gcc dynamic_lib.c -shared -fPIC -o libdynamic_lib.so en la línea de comando
Tenga en cuenta que el nombre del archivo .so generalmente generado debe comenzar con lib

llamar biblioteca

Llamar a los archivos de la biblioteca estática de Windows

├─lib_test.cpp
└─stdafx.h #Este es el encabezado precompilado generado por vc++ en sí mismo, no prestamos atención aquí Aquí debe
configurar el compilador, decirle cuál es el nombre de la biblioteca estática y en que carpeta esta. El lugar que debe establecerse en VS es el directorio project-properties-VC++, complete la ruta C:\Users\john\Desktop\static_lib donde static_lib.h se encuentra en el directorio de inclusión y complete la ruta donde se generó previamente static_lib.lib se encuentra en C:\Users\john\Desktop\static_lib\DEBUG complete el directorio de la biblioteca. Luego, en project-properties-linker-input, ingrese static_lib.lib en las dependencias adicionales (este paso es en realidad equivalente a la oración #pragma comment(lib, "static.lib") en lib_test.cpp, dos Puede elegir uno de los dos). Finalmente compilado con éxito.

Llamar a los archivos de la biblioteca dinámica de Windows

├─lib_test.cpp
└─stdafx.h #Este es el encabezado precompilado generado por el propio vc++, no prestamos atención aquí

#include "stdafx.h"
#pragma comment(lib, "dynamic_lib.lib")
extern int add(int a, int b);
int _tmain(int argc, _TCHAR* argv[])
{
    
    
	int a = 0, b = 2, c;
	c = add(a, b);
	return 0;
}

Tenga en cuenta que aquí hay una inclusión menos en el código y una extern más. El lugar que debe establecerse en VS es el directorio project-properties-VC++, y complete la ruta de acceso dynamic_lib.lib generada anteriormente C:\Users\john\Desktop\dynamic_lib\DEBUG en el directorio de la biblioteca. Luego, en project-properties-linker-input, ingrese dynamic_lib.lib en las dependencias adicionales (este paso es en realidad equivalente a la oración #pragma comment(lib, "static.lib") en lib_test.cpp, dos Puede elegir uno de los dos). Finalmente compilado con éxito. Al ejecutar, debe colocar el archivo .dll en la carpeta donde se genera el exe; de ​​lo contrario, se producirá un error cuando la compilación se realice correctamente.

Características de la biblioteca dinámica:

Ꝏ动态库把对一些库函数的链接载入推迟到程序运行的时期。
Ꝏ可以实现进程之间的资源共享。(因此动态库也称为共享库)
Ꝏ将一些程序升级变得简单。
Ꝏ甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

Window 与 Linux 执行文件格式不同,在创建动态库的时候有一些差异。
Ꝏ在 Windows 系统下的执行文件格式是 PE 格式,动态库需要一个 DllMain 函数做出初始化的入口,通常在导出函数的声明时需要有 _declspec(dllexport)关 键字。
ꝎLinux 下 gcc 编译的执行文件默认是 ELF 格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

Supongo que te gusta

Origin blog.csdn.net/weixin_43925768/article/details/128114611
Recomendado
Clasificación