windows平台下静态库(.lib)和动态库(.dll)使用

这篇具有很好参考价值的文章主要介绍了windows平台下静态库(.lib)和动态库(.dll)使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、静态库和动态库的区别

1. 静态库(.lib)

  • 函数实现和变量的二进制文件
  • 编译链接可执行程序时,静态库会直接展开到文件。
  • 发布可执行程序时,不需要静态库。
  • 编译出的可执行文件较大。

2. 动态库(.dll)

  • windows下动态库一般包含引入库(.lib)文件和动态库(.dll文件)。
  • dll包含函数实现和变量;lib包含该dll的中函数和变量的声明和位置,引入lib库后,就可以找到dll库。
  • 编译链接时只需要lib,程序运行时才动态加载dll,将该dll映射到进程的地址空间中,然后访问dll中导出的函数。
  • 发布时,需要携带lib和dll文件。
  • 编译出的可执行文件较小。

二、动态库的使用

1. 隐式链接

需要.h,lib库,dll库。lib库只在编译用,dll库在运行时用

1.1 (方法一)在VS中配置

比较繁琐,建议方法二

1.1.1 .h库引用

工程属性—>VC++目录—>包含目录—>选择.h所在目录
动态加载dll需要引入lib文件吗,常用工具教程,C++,windows,c++,microsoft,visual studio code

1.1.2 lib库引用

(1)工程属性—>VC++目录—>库目录—>选择lib所在目录
动态加载dll需要引入lib文件吗,常用工具教程,C++,windows,c++,microsoft,visual studio code
(2)在链接时,也需要lib库
工程属性—>链接器—>输入—>附加依赖项
动态加载dll需要引入lib文件吗,常用工具教程,C++,windows,c++,microsoft,visual studio code

1.1.3 dll库引用

我一般就直接配置环境变量了,当然也可以在VS配置dll工作目录,方法如下
(1)工程属性—>VC++目录—>可执行文件目录—>选择可执行目录
动态加载dll需要引入lib文件吗,常用工具教程,C++,windows,c++,microsoft,visual studio code
(2)配置dll目录,工程属性—>VC++目录—>可执行文件目录—>选择可执行目录
动态加载dll需要引入lib文件吗,常用工具教程,C++,windows,c++,microsoft,visual studio code

Windows查找dll库的顺序:

  • exe文件所在的目录下;
  • 进程当前的工作目录;
  • Windows系统目录;
  • Windows目录;
  • 环境变量Path下的一系列目录

1.2 (方法二)最简单的办法

(1)添加lib库,工程属性—>VC++目录—>库目录—>选择lib所在目录(或者直接在代码里写#pragma comment(lib, “Lib.lib”)

#include "stdafx.h"
#include "DLLSample.h"

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

int main()
{
        TestDLL(123);   //dll中的函数,在DllSample.h中声明
        return(1);
}

(2)添加.h头文件,工程属性—>VC++目录—>包含目录—>选择.h所在目录
(3)将dll库放入项目目录

2. 显示链接

如果只有dll库,则只能进行显示链接

  • 使用Windows API的LoadLibrary函数,将DLL模块映像到进程的内存空间,对dll模块进行动态加载。
  • 使用GetProcAddress函数得到要调用dll中的函数的指针。
  • 不用dll时,使用FreeLibrary函数或从进程的地址空间显式卸载dll。
#include <iostream>
#include <windows.h>         //使用函数和某些特殊变量

typedef void (*DLLFunc)(int);

int main()
{
        DLLFunc dllFunc;
        HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");//可以使用dll库的绝对路径,否则将会按照windows搜索方式进行搜索

        if (hInstLibrary == NULL)
        {
          FreeLibrary(hInstLibrary);
        }
        dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
        if (dllFunc == NULL)
        {
          FreeLibrary(hInstLibrary);
        }
        dllFunc(123);
        std::cin.get();
        FreeLibrary(hInstLibrary);
        return(1);
}

三、静态库的使用

  • 静态库lib文件是多个obj文件的集合,obj文件是cpp文件编译生成的
  • lib文件包含了链接库的所有信息(函数代码和接口信息)
  • 只需要.h文件和lib文件

1. 添加lib

方式与动态库相同

2. 添加.h

方式与动态库相同

参考:基础:windows下lib和dll的区别和使用文章来源地址https://www.toymoban.com/news/detail-789147.html

到了这里,关于windows平台下静态库(.lib)和动态库(.dll)使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包