《C语言杂记》静态库和动态库(Windows版)

2024-08-30 12:32

本文主要是介绍《C语言杂记》静态库和动态库(Windows版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4 Windows创建和使用静态库

笔者这里使用的是VS2015,当然也可以使用其他工具。

4.1生成静态库

1.首先打开VS,先新建一个项目,选择win32控制台应用程序,当然选择win32项目也可以。
在这里插入图片描述

2.接下来选择“下一步”进入应用程序设置,这里选择静态库并去掉预编译头,当然也可以在创建项目后去掉也是可以的。最后点击“完成”即可创建项目。

在这里插入图片描述

3.创建头文件(.h)以及源文件(.cpp)
StaticLib.h

#ifndef _STATIC_LIB_H_
#define _STATIC_LIB_H_#include <iostream>namespace StaticLib
{void print_hello();  //Test function
}#endif

StaticLib.cpp

#include "StaticLib.h"void StaticLib::print_hello()
{std::cout << "Hello world!" << std::endl;
}

4.生成解决方案,我这里选择的是release

在这里插入图片描述

5.编译成功后就可以在工程目录下看到静态库。

在这里插入图片描述

4.2使用静态库

1.还是创建个普通的win32控制台程序。

在这里插入图片描述

在应用程序设置界面选择“控制台应用程序”,还是不勾选“预编译头”。

在这里插入图片描述

2.我们把上面创建lib时的头文件包含到新创建的控制台程序中,同时将lib文件复制到工程目录下。当然也可在编写测试程序时使用库所在的路径。

3.然后在测试源文件中输入以下代码:

#include "StaticLib.h"#pragma comment(lib,"WindowStaticLib.lib")int main()
{StaticLib::print_hello();system("pause");return 0;
}

#pragma comment(lib,“xxx.lib”)表示链接xxx.lib这个库。

4.最后生成并执行工程。

在这里插入图片描述

值得注意的是,生成应用程序的环境应与创建库的环境一样。

当然还有一种调用方式。

首先在测试工程目录下新建如下文件夹,将库和头文件分别拷贝到相应的文件夹中。

在这里插入图片描述

然后在配置下工程属性:

在这里插入图片描述

另外还需要属性页面中选择链接器->输入->附加依赖项中添加新生成的库。

在这里插入图片描述

同样也能得到正确结果。

另外,调用的代码更改如下:

#include "StaticLib.h"int main()
{StaticLib::print_hello();system("pause");return 0;
}

当然啦,也可以不配置链接器中的库。还是保留一下语句:

#pragma comment(lib,"WindowStaticLib.lib")

以上两种方式本质都是一样的,只是通过不同的方式来配置罢了。




5 Windows创建和使用动态库

5.1生成动态库

1.首先创建一个动态库工程。

在这里插入图片描述

和静态库一样,取消去掉预编译头,这里选择DLL。

在这里插入图片描述

2.创建头文件(.h)以及源文件(.cpp)

DynamicLib.h

#ifndef _DYNAMIC_LIB_H_
#define _DYNAMIC_LIB_H_#include <iostream>#define DLL_EXPORTS#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
extern "C" {namespace DynamicLib{DLL_API void print_hello();}
}#endif // _DYNAMIC_LIB_H_

DynamicLib.cpp

#include "DynamicLib.h"DLL_API  void DynamicLib::print_hello()
{std::cout << "Hello world!" << std::endl;
}

【注1】__declspec(dllexport)是导出符号,也就是定义需要导出函数的dll中给导出函数的函数声明前面加上导出符号,表示该方法可以导出给其他DLL或者exe使用。

【注2】C++的代码加extern “C”,是为了保证编译时生成的函数名不变,这样动态调用dll时才能。

3.选择release生成解决方案,最后生成的库如下图所示:

在这里插入图片描述

好了,动态库就创建好了。

5.2使用动态库

1.还是创建个普通的win32控制台程序。

在这里插入图片描述

2.将前面创建的动态库的头文件(.h),dll文件复制到与测试项目中。

在这里插入图片描述

3.编写测试

有两种方法调用动态库,一种隐式链接,一种显示链接

先说第一种隐式调用。隐式调用需要.h文件,.dll文件,.lib文件

在源文件加入如下代码:

#include "DynamicLib.h"#pragma comment(lib,"WindowDynamicLib.lib")int main()
{DynamicLib::print_hello();system("pause");return 0;
}

然后编译运行。

在这里插入图片描述

接下来在看看显式调用。显式调用需要.dll文件,.lib文件

#include <iostream>
#include <windows.h>typedef int(*dllfun)(void);//定义指向dll中函数的函数指针int main()
{HINSTANCE hlib = LoadLibrary(L"WindowDynamicLib.dll");if (!hlib){std::cout << "load dll error\n";return -1;}dllfun fun = (dllfun)GetProcAddress(hlib, "print_hello");if (!fun){std::cout << "load fun error\n";return -1;}fun(); //print_hello()FreeLibrary(hlib);system("pause");return 0;
}

结果和隐式调用一致。




6静态库和动态库总结

静态库:编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

静态库的代码在编译时链接到应用程序中,因此编译时库文件必须存在并且需要通过“-L”参数传递给编译器,应用程序在开始执行时,库函数代码将随程序一 起调入进程内存段直到进程结束,其执行过程不需要原静态库存在。

动态库:动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。相当于静态库,不同的应用程序可以使用同一份动态库,因此可以节省内存。另外,而且动态库还可被其他语言调用,诸如Python。

总之,静态库和动态库的载入时刻不同,静态库是编译时用到的,动态库是运行时用到的。以Windows为例,如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。




欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书


欢迎订阅我的微信公众号

在这里插入图片描述

这篇关于《C语言杂记》静态库和动态库(Windows版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120829

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务