.dll.a文件

2024年8月17日,周六上午


.dll.a 文件是一种特殊的库文件,通常在 Windows 系统中使用,它结合了静态库和动态库的特点。.dll.a 文件实际上是静态库(.a 文件),但它是为 MinGW(Minimalist GNU for Windows)编译器设计的,用于链接到动态链接库(DLL)。

在 Windows 上,静态库通常以 .lib 为后缀,而动态链接库以 .dll 为后缀。然而,MinGW 使用 .dll.a 文件来提供对动态链接库的链接信息,这样可以在编译时链接到 DLL,但在运行时仍然依赖于 DLL 的存在。

.dll.a 文件包含了函数的导出信息,但没有包含函数的实际实现代码。在运行时,程序会动态地从相应的 .dll 文件中加载这些函数的实现。
例如,如果你在 MinGW 中编译一个使用 libmylibrary.dll 的程序,你可能会在链接时使用 libmylibrary.dll.a 文件。这样,在编译时链接器会知道如何链接到 libmylibrary.dll 中的函数,但在运行时程序会从系统中的 libmylibrary.dll 文件中加载这些函数。

.dll.a 文件通常是由 dlltool 工具生成的,它可以从 .dll 文件中提取导出信息,并创建相应的 .dll.a 文件。这样,MinGW 编译器就可以像链接静态库一样链接到动态链接库了。

总结来说,.dll.a 文件是一种特殊的静态库文件,用于在 MinGW 环境中链接到动态链接库。它提供了动态链接库的链接信息,但在运行时仍然依赖于 DLL 文件。

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

巨龙之路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值