.dll、.lib、.dll.a 的区别

我们已 ffmpeg 的动态链接库为例,描述一下这三个文件的作用:

目录整体结构:
在这里插入图片描述
分析 bin 目录:

  • ffmpeg、ffplay、ffprobe 之所以这么小,是因为他们运行的时候会调用 .dll 文件当中的代码。
  • dll:真正存放函数体的地方。
    在这里插入图片描述

分析 lib 目录:

  • 里面有三种文件后缀分别为:.lib、.def、.dll.a 。
  • .def:暂时还不太清楚。
  • .lib:用于MSVC编译器中 (MSVC 微软自己的编译器)
  • .dll.a:用于MinGW编译器中(MinGW gcc/g++,MinGW则是指Minimalist GNU for Windows的缩写)

这三个文件里面并不存放真正的函数代码本体
只是包含了函数所在的DLL文件和文件中 函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

在这里插入图片描述
include:存放对应的头文件信息。
在这里插入图片描述

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
MSVC vs. MinGW 之 (lib,dll,def,obj,exe) vs (a,dll,def,o,exe) 玩转攻略手记 一份粗糙的研究记录,有待补完和整理。 MinGW: c -> o gcc -c a.c c -> exe gcc a.c libs.o -o a.exe (从主程序a.c,附加libs,生成a.exe) o -> exe gcc a.o b.o ... -o main.exe c -> dll,def,a gcc a.c -shared -o a.dll -Wl,--output-def,a.def,--out-implib,liba.a a -> dll a2dll liba.a dll -> a: dlltool --dllname a.dll --def a.def --output-lib liba.a (需要def文件) a -> def: dumpbin /exports lib.a > lib.def (在windows上调用,def需要修改) dll -> def : pexports a.dll -o > a.def (这里的-o是指给函数标序号) lib -> def : reimp -d a.lib lib -> a: (for __cdecl functions in most case) reimp a.lib; (for __stdcall functions) MSVC: c -> lib cl /LD a.c (注意已经定义了export列表) c -> dll cl /LD a.c c -> obj cl /c a.c c -> exe cl a.c /out:a.exe dll ->lib lib /machine:ix86 /def:a.def /out:a.lib (需要def文件) obj ->lib lib a.obj b.obj... /out:mylib.lib dll ->def DUMPBIN a.dll /EXPORTS /OUT:a.def (生成的def需要做修正) lib ->def reimp -d a.lib (这个要在MSYS+MinGW下用) 关于这些工具的适用范围可以很容易的理解和记忆。 dll和exe都是PE文件,所以可以使用pexports. lib和a是静态库文件,都是归档类型,不是PE格式。所以不能使用pexports. dll可以使用dlltool. lib可以使用lib, 和reimp(lib->a工具) 所有的bin文件,包括dll,exe,lib,a都可以使用dumpbin. 参考: http://hi.baidu.com/kaien_space/blog/item/5e77fafa2ba9ff16a8d3110a.html Mingw官网文档: http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs http://oldwiki.mingw.org/index.php/CreateImportLibraries http://www.mingw.org/wiki/FAQ http://hi.baidu.com/opaquefog/blog/item/9b21b6deb324e25dccbf1ab7.html http://qzone.qq.com/blog/8330936-1238659272 http://hi.baidu.com/jzinfo/blog/item/b0aa1d308de99f9da8018e00.html 本篇测试用代码: 1. main.cpp #include #include #include "mylib.h" using namespace std; int main() { char str[]="Hello world!"; printhello(str); return 0; } 2. mylib.cpp #include #include #include "mylib.h" using namespace std; void EXPORT printhello(char *str) { cout << str << endl; } 3. mylib.h #define EXPORT __declspec(
libmysql.dlllibmysql.lib是MySQL数据库系统使用的两个文件。 libmysql.dll是一个动态链接库文件,它包含了MySQL数据库系统所需要的函数和资源。在程序运行过程中,当需要调用MySQL数据库相关的功能时,会通过动态链接的方式加载libmysql.dll文件,并从中获取相应的函数和资源来完成操作。这种设计使得程序的开发和维护更加灵活,可以在运行时根据需要加载和卸载libmysql.dll,提高了程序的性能和效率。 libmysql.lib是一个静态库文件,它包含了MySQL数据库系统所需要的函数和资源的实现代码。在使用静态链接方式编译程序时,编译器会将libmysql.lib的代码直接嵌入到生成的可执行文件中,使得程序在运行时不再需要依赖于libmysql.dll文件。这种设计使得程序的部署更加简单,不需要额外地安装和配置libmysql.dll,但同时也增加了程序的体积。 使用libmysql.dlllibmysql.lib,我们可以在程序中方便地实现与MySQL数据库的连接、查询、插入、更新、删除等功能。通过调用这两个文件中提供的函数,我们可以简化数据库操作的代码,提高程序的开发效率和易读性。 总而言之,libmysql.dlllibmysql.lib是MySQL数据库系统使用的两个文件,分别提供了动态链接和静态链接方式的实现代码。它们在程序中起着连接和调用数据库功能的作用,使得我们可以方便地开发出与MySQL数据库交互的程序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想文艺一点的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值