静态链接库(Lib)和动态链接库(DLL)

lib静态链接库,dll动态链接库,h文件 最近在弄摄像头,发现我在调用摄像头自带的函数的时候,库没连接上,于是经过高人指点,学习了一下lib静态链接库,dll动态链接库来补充一下自己的基础知识。 一、首先我们来介绍一下lib静态链接库。    lib静态链接库是在编译时要用到,如果只需要编译源代码的话只要有.lib文件就好了。下面主要讲一下在vs2010中如何使用自己建立的.lib文件,以及如何使用lib文件。   1、建立lib文 阅读详情

            序言:本文主要讲解静态链接库和动态链接库的区别,以及怎么样编译和引用两种库,怎么样从DLL中导出函数和导出C++类。

一、静态链接库和动态链接库

         1.静态链接库(.LIB):函数和数据被编译进一个二进制文件。发布时,只需要发布这个可执行文件,并不需要发布被使用的静态库。

         2.动态库(.DLL):在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)。虽然引入库和静态库的后缀名相同,但是差别很大。对于一个DLL来说,其引入库文件包含该DLL导出的函数和变量的符号名,而.dll文件包含DLL的实际的函数和数据。在使用动态链接库的情况下,在编译链接可执行文件时,只需要DLL的引入库文件,而在运行可执行程序时,需要加载所需要的DLL,发布产品时,需要发布调用的动态链接库。

二、静态链接库的创建和引用

            a.创建静态链接库

        打开VS2008,创建一个Win32控制台应用程序,选择静态链接库选项,不加预编译头文件。如下:


    

    新建一个头文件add.h和源文件add.cpp

    add.h

#ifndef ADD_H
#define ADD_H
int add(int a, int b);
#endif  // ADD_H
add.cpp

#include "add.h"
int add(int a, int b) {
    return a + b;
}
然后编译,在Debug目录下生成LIB1.lib

        b.引用静态链接库

        首先创建一个测试程序test,调用代码如下:

#include "../LIB1/add.h" 
#include <stdio.h>
extern int add(int a, int b);
int main() {
    int a = 2;
    int b = 1;
    printf("a=%d, b=%d\n", a,b);

    printf("add: %d\n", add(a,b));
    getchar();
    return 0;
}
如果直接编译,会出现如下的错误,主要原因是找不到要引用的lib文件,下面讲解引用的方法


 引用方法一:当有该lib项目的时候使用。右键单击测试项目,选择引用,弹出下面的框


 

单击确定后即可。

 引用方法二:拖放的方法,该方法只针对第三方库。将要引用的lib文件复制到该项目的debug目录下,用鼠标将该lib文件拖放到资源文件夹下。


引用方法三:配置方法。对于带有配置文件的第三方库。将lib文件复制到debug目录下,设置项目的属性,找到链接的输入选项,在附加依赖项中添加要引用的库,这里为:.\debug\LIB1.lib



三、动态链接库的创建和引用

 

     a.动态链接库的创建

              导出函数

          首先在VS2008中创建一个空的DLL1项目,编写两个函数,分别为加法和减法。

 

int add(int a,int b)
{
	return a+b;
}
int subtract(int a,int b)
{
	return a-b;
}

对上面的代码进行编译,在该项目的debug目录下生成DLL1.dll文件。

     这时候外部的程序还不能对该DLL进行调用,主要是因为该DLL没有导出函数。这里使用Dumpbin命令来查看一个DLL有哪些导出函数。在命令行下输入 dumpbin命令,如下:

该命令在VS安装目录的bin文件夹下面

          注明:如果无法执行该命令,则在该界面下执行VCVARS32.bat文件。每次启动新的命令需要运行该文件。

    查看该DLL提供的导出函数:dumpbin -exports DLL1.dll

上面显示没有导出函数。从DLL导出函数需要在每一个将要被导出的函数前面添加标志符:_desclspec(dllexport)

修改后的函数:

_declspec(dllexport)int add(int a,int b)
{
	return a+b;
}
_declspec(dllexport)int subtract(int a,int b)
{
	return a-b;
}

编译之后,在debug目录下会生成两个文件,引入库DLL1.lib和DLL1.dll文件。然后重新查看该DLL的导出函数。


从上图可以看到多出了一些信息,ordinal表示导出函数的序号,hint表示提示码,RVA列出的地址值是导出函数在DLL模块中的位置,即通过该地址可以在DLL中找到它们;name列出了导出函数的名字。由于C++支持函数重载,对于重载的函数名是一样的,为了方便区别,在编译连接的时候,C++会按照自己的规则修改函数的名字,称为“名字编写”。

 

引用该DLL

首先为了让编译器知道这两个函数,需要用extern 声明,如下:

#include <stdio.h>
extern int add(int a, int b);
extern  int subtract(int a,int b);
int main() {

   int a = 2;
    int b = 1;
    printf("a=%d, b=%d\n", a,b);
    printf("add: %d\n", add(a,b));
     printf("subtract: %d\n", subtract(a,b));
    getchar();
    return 0;

}

编译出现如下错误:

这里产生三个错误是由于程序链接的时候产生的。为了解决这个问题,需要将DLL的引入库文件DLL1.lib文件复制到test工程目录下。并且设置附加依赖项.\debug\DLL1.lib。

重新编译,发现没有错误。然后运行该测试程序,出现如下错误:

主要原因是该测试程序找不到要加载的DLL1.dll文件,应该将该文件拷贝到test项目所在的目录下,再运行就不会发生错误。

注明:采用dumpbin -imports test.exe 可以查看该程序的输入信息以及其要加载的DLL信息。

           采用Depends工具可以查看一个DLL或exe所依赖的动态链接库。

 

利用_declspec(dllimport)声明外部函数:上面采用的是extern来声明,如果调用的函数来自动态链接库,建议采用_declspec(dllimport),可以生成效率更高的代码。
 _declspec(dllimport) int add(int a, int b);
_declspec(dllimport) int subtract(int a,int b);

 

 如何让用户知道该DLL导出了哪些函数呢?在写DLL的时候,应该使用头文件,DLL1.h

#ifndef DLL1_H
#define DLL1_H
#ifdef BUILD_DLL
#define PORT_DLL __declspec(dllexport)
#else
#define PORT_DLL __declspec(dllimport)
#endif
int PORT_DLL add(int a, int b); int PORT_DLL subtract(int a,int b);
#endif  // DLL1_H

源文件DLL1.CPP修改如下:

#define BUILD_DLL
#include"DLL1.h"

PORT_DLL int add(int a,int b)
{
	return a+b;
}
PORT_DLL int subtract(int a,int b)
{
	return a-b;
}


在调用的程序直接包含该头文件#include"DLL1.h"即可。

#include <stdio.h>
#include"DLL1.h"
int main() {

    int a = 2;
    int b = 1;
    printf("a=%d, b=%d\n", a,b);
    printf("add: %d\n", add(a,b));
     printf("subtract: %d\n", subtract(a,b));
    getchar();
    return 0;
}


 DLL中导出C++类:

首先在DLL1.h的头文件中定义一个类:

 

#ifndef DLL1_H
#define DLL1_H
#ifdef BUILD_DLL
#define PORT_DLL _declspec(dllexport)
#else
#define PORT_DLL _declspec(dllimport)
#endif
int PORT_DLL add(int a, int b); 
int PORT_DLL subtract(int a,int b);
class PORT_DLL Point
{
public:
	int Max(int a,int b);
};
#endif  // DLL1_H


 在DLL1.CPP文件中定义函数:

#define BUILD_DLL
#include"DLL1.h"

PORT_DLL int add(int a,int b)
{
	return a+b;
}
PORT_DLL int subtract(int a,int b)
{
	return a-b;
}
int Point::Max(int a, int b)
{
	return a>=b?a:b;
}


编译之后,将DLL1.lib,DLL1.dll和Dll1.h拷贝到test项目下,然后进行调用:

#include <stdio.h>
#include "DLL1.h"

int main() {

   int a = 2;
    int b = 1;
    printf("a=%d, b=%d\n", a,b);
    printf("add: %d\n", add(a,b));
     printf("subtract: %d\n", subtract(a,b));
	 Point pt;
     printf("Point: %d\n",pt.Max(a,b));
    getchar();
    return 0;
}

导出一个类的某个函数:

class  /*PORT_DLL*/ Point
{
public:
	PORT_DLL int Max(int a,int b);
};


用dumpbin -exports DLL1.dll查看该DLLL导出的函数:


从上图可以看到导出了一个类Point, 以及该类中的Max函数,还有两个函数,但是 他们的函数名字已经发生改变。

     名字改编问题:

    C++编译器在生成DLL时,会对导出的函数进行名字修改,并且不同的编译器使用的改编规则不同。如果利用不同的编译器分别生成DLL和访问该DLL的客户端程序的话,则访问DLL的导出函数就会出现问题。如果用C++语言编写了一个DLL,那么用C语言编写的客户端访问该DLL的函数就会出现问题。因为后者使用函数原始名称来调用DLL中的函数,而C++编译器已经对该名称进行了改编,所以C语言编写的客户端程序就找不到所需DLL中的函数。

对于C++ 与C中的兼容,我们希望动态链接库在编译的时候,导出函数的名称不要发生变化,可以在定义导出函数时候,加上extern "C",C大写。如下:

 

#ifndef DLL1_H
#define DLL1_H
#ifdef BUILD_DLL
#define PORT_DLL extern"C" _declspec(dllexport)
#else
#define PORT_DLL  extern"C" _declspec(dllimport)
#endif
int PORT_DLL add(int a, int b); 
int PORT_DLL subtract(int a,int b);
class PORT_DLL Point
{
public:
	int Max(int a,int b);
};
#endif  // DLL1_H

编译,用dumpbin查看,发现名字没有发生改变。


extern "C"可以解决C++与C语言之间的相互调用的函数命名问题。但是有一个缺陷,就是不能导出一个类的成员函数。

如果导出函数的调用约定发生改变,即使使用了extern ”C“,该函数的名字仍然会发生改变。

下面采用标准调用约定,即在声明这些函数时添加_stdcall关键字;

#ifndef DLL1_H
#define DLL1_H

#ifdef BUILD_DLL
#define  PORT_DLL  extern"C" _declspec(dllexport)
#else
#define PORT_DLL  extern "C" _declspec(dllimport)
#endif

 PORT_DLL int _stdcall  add(int a, int b); 
 PORT_DLL  int  _stdcall subtract(int a,int b);
/*class PORT_DLL Point
{
public:
	int Max(int a,int b);
};*/
#endif  // DLL1_H




源文件:

#define BUILD_DLL
#include"DLL1.h"

PORT_DLL int _stdcall add(int a,int b)
{
	return a+b;
}
PORT_DLL int _stdcall subtract(int a,int b)
{
	return a-b;
}
/*int Point::Max(int a, int b)
{
	return a>=b?a:b;
}*/


编译然后查看:

从上图可以看到,add函数的名字变为_add@8,在add前面有一个下划线,后面跟一个@,接着是数字8,该数字表示add函数的参数所占的字节数,因为有两个int 参数。

通过上图可以发现,如果函数的调用约定发生了变化,即使在声明这些导出函数时使用了extern "C",它的名字仍然会发生变化。C语言和Delphi语言的调用约定不一样,后者使用pascal调用约定,即标准调用约定_stdcall.解决这种问题,可以定义一个模块定义文件(DEF)来解决名字改编问题。

  

      使用DEF文件导出函数。首先创建一个新项目DLL2,在 DLL2.cpp中添加代码:

 int  add(int a,int b)
{
	return a+b;
}
 int  subtract(int a,int b)
{
	return a-b;
}

在该工程目录下,新建一个Dll2.DEF空文件,后缀名为def,然后通过下面方式加入到工程:项目——属性——连接器——输入——模块定义文件 中输入你所定义的def文件名

在Dll2.def加入如下的代码:

LIBRARY DLL2

EXPORTS 表明DLL将要导出的函数
add
subtract

如果想要导出的符号名和源文件中定义的函数名不一样,可以按照下面方法定义,比如要将add函数导出为myadd函数:

LIBRARY DLL2

EXPORTS
myadd=add
subtract

 

然后编译,用dumpbin工具查看导出函数,发现函数名字不变。



使用DEF文件来导出函数不需要使用_stdcall 和 _declspec(dllexport)

电力电子技术文章:ACOT控制模式在Buck变换器中的频率稳定性分析 本文深入分析了ACOT控制模式在Buck变换器中实现频率稳定性的原理与优势。通过对比传统COT模式,阐述了ACOT如何通过自适应调整导通时间,将开关频率锁定在设定值,从而有效应对输入电压与负载变化。文章还探讨了其在轻载DCM模式下的高效与平滑切换特性,并提供了关键的设计考量与实战指南。 阅读详情

相关推荐

Vivado项目开发新思路:用VSCode写代码,用Vivado管理IP核与综合(Windows/Mac环境通用指南)

本文介绍了如何结合Vivado和VSCode的优势,打造高效的FPGA设计工作流。通过配置VSCode的Verilog插件和Vivado环境集成,开发者可以在VSCode中编写代码,同时利用Vivado管理IP核与综合,显著提升开发效率和团队协作体验。

weixin_42545503的博客 336

lib库知识全面讲解(.lib、.dll)

一、静态链接lib库和lib导入库以及动态链接库dll的关系 “lib静态库”和“导入lib库”这些词汇相信我们经常听说了吧。但是lib怎么来的,怎么使用的我们很多人还真不知道哦。我也是专门研究学习才发现的。所以在此详细讲述下,分享给大家。想详细了解完整的编译链接的过程,可以看看《C++零基础入门课程》的第三章,很不错的。 先感叹一下:怎么努力还是被抛弃了:悲剧的人生莫过Lib库了!!如果你不懂,仔细看完下面的介绍你就懂了。 lib库实际上分为两种,一种是静态链接lib库或者叫做静态lib库,

zxmyoung的博客 5万+

Wonderware Intouch 2014R2 SP1 安装教程

下载Wonderware System Platform 2014R2 SP1 and Intouch 2014R2 SP1的安装压缩包,如下 软件的下载连接地址如下: https://pan.baidu.com/s/1a2GnI_nfT3vK1l49B94FIQ, 提取码:6ec6 或者直接微信扫描下面的二维码 管理员运行下面的setup.exe可执行程序, 进入安装,选择Product Based Selection, 自定义选择需要安装的程序,如下: 普通的Into

工控先生 3万+

静态库(lib)和动态库(dll)的使用

静态库(lib)和动态库(dll)的理解与使用前言一、函数重载的理解二、extern “C” 的理解三、静态库的调用1.静态库的生成2.静态库的调用四、动态库的调用1.动态库的生成2.动态库的调用 前言 说明   静态库和动态库在windows软件开发当中很常用,好的软件架构很多功能都是以库的形式存在,假如该功能需要升级,则直接替换该库文件就行,不需要把整个程序进行升级。这样维护起来就比较方便。   常见的库文件有.lib和.dll两种形式,分别是静态库和动态库。   静态库在形成exe文..

张一西的博客 8328

无线充电效率从75%到90%+:深入拆解LCC补偿网络如何成为电动汽车和智能车竞赛的‘稳压器’

本文深入探讨了LCC补偿网络如何显著提升无线充电效率至90%以上,成为电动汽车和智能车竞赛中的关键技术。通过分析LCC的三元件结构和双模式切换特性,揭示了其在负载突变和线圈错位情况下的稳定性优势,并展示了实际应用中的效率提升和产业化挑战。

weixin_42528191的博客 396

【YOLOv11改进 - 特征融合】SDI:多层次特征融合模块,替换contact操作

【YOLOv11改进 - 特征融合】SDI:多层次特征融合模块,替换contact操作

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1770

.lib 文件,.dll 文件,.sln 文件都是干嘛的,他们各自都哪些内容,是如何生成这些文件的

.lib 文件,.dll 文件,.sln 文件都是干嘛的,他们各自都哪些内容,是如何生成这些文件的

m0_51913750的博客 8968

软考高级系统架构设计师历年论文真题深度分析(2011-2025)

本文系统分析了2011-2025年系统架构设计师论文真题,归纳出十大主题类别,包括架构风格、企业集成、数据技术、非功能属性等。研究发现新兴技术占比最高(18.8%),企业集成、数据架构和非功能属性为三大核心考点。论文命题呈现明显技术演进特征,从经典架构理论逐步转向云原生、AI融合等前沿方向。备考建议重点关注高频考点和技术前沿,同时强化场景化解决方案能力。分析表明,架构师考试持续跟踪行业技术发展,注重理论与实践结合,为考生提供了明确的备考方向。

一几文的编程学习笔记。 2032

lib 和 dll 的区别

首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。 静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.l...

每一个不曾起舞的日子,都是对人生的辜负。 949

让 Claude Code 接管 SAP 事务流, 用 Python 和 SAP GUI Scripting 做一个真正能干活的 AI Agent

摘要:SAP系统自动化面临的核心瓶颈在于繁琐的GUI操作而非分析能力不足。通过整合Claude AI、Python和SAP GUI Scripting技术,可构建能直接操作SAP界面的智能代理。该方案利用SAP官方提供的脚本接口,实现事务码执行、界面导航、数据提取等自动化操作,特别适用于DMLT过账引擎等复杂错误分析场景。相比传统SQL导出方案,这种GUI级自动化能处理树控件、ALV表格等复杂界面元素,且无需额外API开发,直接在现有SAP GUI会话上工作,在保持原有权限体系的同时显著提升效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 321

EtherCAT用TwinCAT 3跑DC报0x2C或者0x1A错误码

EtherCAT用TwinCAT 3跑DC报0x2C或者0x1A DC报错 ///////////////////////////////////////////////////////////////////////////////////////// /** \brief Checks communication and synchronisation variables and update AL status / AL status code if an error has occurr

PI_sunyang的博客 5304

静态链接库lib 与 动态链接库dll的定义和区别

主要介绍静态链接库lib 与 动态链接库dll的定义和区别

bigger_belief的博客 2690

【深度学习新浪潮】Qwen3.5-397B-A17B 深度解析与工程部署实战:超大MoE模型的推理加速与落地

Qwen3.5-397B-A17B是当前开源社区综合能力最强、部署效率最高的超大模型,其MoE架构彻底解决了“大模型难部署、慢、贵”的痛点。

专注:太空算力、AI infra、异构调度、大模型成本工程 1706

动态链接库dll,导入库lib,静态链接库lib

一.windows下动态链接库dll,导入库lib,静态链接库lib 1.导入库lib与静态链接库lib 目前以lib后缀的库有两种,一种为静态链接库(StaticLibary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(ImportLibary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib...

积累点滴,保持自我 1635

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。

静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。 一、 静态链接库(LIB,也简称“静态库”)与动态链接库(DLL,也简称“动态库”)的区别     静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必 被包含在最终 EX

iw1210的专栏 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

静态链接库(Lib) 与 动态链接库(DLL)

静态链接库(Lib) 与 动态链接库(DLL)

neuzhangno的博客 1551

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

静态链接库(.lib)和动态链接库(.dll)的使用

静态链接库(.lib)和动态链接库(.dll)的使用 文章目录静态链接库(.lib)和动态链接库(.dll)的使用一、静态链接库1. 静态链接库概述2. 创建静态链接库3. 调用静态链接库二、动态链接库(dynamic linking library)1. 动态链接库概述2. 创建动态链接库并导出函数导出函数两种方式1. 用.def文件导出2. __declspec(dllexport)关键字导出3. 从工程中导入dll中的函数导入函数两种方式1. 隐式链接2. 显式链接 注--------本文所有测试均以

qq_51340322的博客 3009

C++通过动态链接库导出类,以及WINDOWS的静态链接库LIB和动态链接库DLL基本区别和使用

WINDOWS下的静态链接库LIB和动态链接库DLL基本区别和使用 自己理解和整理的: 1、纯静态库LIB,包含所有函数内容和地址,全部编入程序中,是CPP编译出的OBJ文件的简单链接。 2、动态库DLL编译生成的lib,lib只含函数入口供编译时静态链接使用(使用Win API loadlibrary动态加载dll可以不用这个lib),DLL含函数内容和地址,运行时加载。 3、纯静态库L...

fantasysolo的博客 4208

MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用

静态链接库LIB和动态链接库DLL的区别,创建和示例   1.什么是静态连接库,什么是动态链接库   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。

拥抱变化 9577

Lib静态链接库和Dll动态链接库

dll:Dynamic Link Library动态链接库。dll是编译好的完整程序, 已经经过链接,有函数导出表与导入表。使用时可以直接调用其中的函数。dll在程序运行的时候才被链接,但并不参加工程的编译,因此它是一种比较小的可执行文件格式。dll还有其他的文件格式如ocx等,所有的dll文件都是可执行的。lib只是一个代码集,它把一些函数做成一个函数集合放在一起,这些函数没有链接。如果

百泉居 2017

【Windows】 静态链接库和动态链接库,DLL的静态加载和动态加载,两种LIB文件。

一、 静态链接库(LIB,也简称“静态库”)与动态链接库(DLL,也简称“动态库”)的区别     静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态

AG的博客 1804

Qt静态链接库(.lib .a)、动态链接库(.dll)创建和使用教程

先对库进行介绍,后对Qt静态链接库(.lib .a)、动态链接库(.dll)进行创建和使用的介绍! 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引

卓学课堂 1万+

静态链接库LIB和动态链接库DLL的区别

<br /> <br />静态链接库LIB和动态链接库DLL的区别<br />一、        静态链接库与动态链接库区别<br />静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态

Augusdi的专栏 2万+

静态链接库lib和动态链接库dll

静态链接库lib和动态链接库dll 静态链接库lib 动态链接库dll 区别 lib在编译的时候用到,dll在运行exe时用到 错误记录 错误:使用handle = dlopen(fn, RTLD_NOW|RTLD_LOCAL)加载rc.dll时,返回值为NULL,错误原因应该是rc.dll中和cl相关的函数无法解析。 解决方法: ...

weixin_43601062的博客 188

动态链接库(dll)与静态连接库(lib)

一、前言 dll(dynamic)动态链接库,包含多个程序执行的代码和数据,程序运行时是需要使用dll; lib(static)静态链接库,包含dll中各函数的入口信息,在程序编译时用到; 动态连接库可以使设计者隐藏函数的具体实现,便噶增加代码的复用性; 动态链接库参与的程序中,lib文件和dll文件都要用到。 二、dll的生成 头文件中增加下面几行代码 #pragma once #ifdef XXXX_EXPORTS //如果定义了XXXX_EX

xiaofeilongyu的博客 1574

lib静态链接库与dll动态链接库

lib库分为两种:静态链接lib库(静态lib库)。动态链接库dll库的lib导入库(lib导入库)

qq_44452887的博客 586
上一篇: 【Programming Pearls】查找所有的变位词
下一篇: MLP、RBF、SVM网络比较及其应用前景
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值