请问在DLL动态库的显示调用中lib文件的作用是什么,它包含动态库的实现代码吗,是不是有了它DLL文件就不用了

eisldkw 2018-07-02 08:40:02
请问在DLL动态库的显示调用中lib文件的作用是什么,它包含动态库的实现代码吗,是不是有了它DLL文件就不用了
...全文
462 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
eisldkw 2018-07-11
  • 打赏
  • 举报
回复
引用 28 楼 zhao4zhong1 的回复:
一个lib是
静态/动态
含代码/不含代码
32位/64位
C/C++
……
请使用dumpbin.exe查看。

非常感谢
eisldkw 2018-07-11
  • 打赏
  • 举报
回复
引用 27 楼 schlafenhamster 的回复:
"动态库的静态链接和动态链接,"
说的是 动态库 (dll),用 lib (静态)连接 和 用 GetProcAddress (动态)连接。


静态库 指的是 lib 中 含 代码的 不用 dll 的 。

非常感谢
赵4老师 2018-07-09
  • 打赏
  • 举报
回复
一个lib是
静态/动态
含代码/不含代码
32位/64位
C/C++
……
请使用dumpbin.exe查看。
schlafenhamster 2018-07-07
  • 打赏
  • 举报
回复
"动态库的静态链接和动态链接,"
说的是 动态库 (dll),用 lib (静态)连接 和 用 GetProcAddress (动态)连接。


静态库 指的是 lib 中 含 代码的 不用 dll 的 。
eisldkw 2018-07-07
  • 打赏
  • 举报
回复
引用 25 楼 tajon1226 的回复:
补充一下,动态库的静态链接和动态链接,exe都依赖该dll文件!!


非常感谢,但是大师们,有说的纯LIB方式 不需要DLL文件,而您又说纯LIB方式也需要DLL文件。我等菜鸟,真无从知道到底谁的是标准答案了。能提供一下 资料的出处吗?
走好每一步 2018-07-06
  • 打赏
  • 举报
回复
补充一下,动态库的静态链接和动态链接,exe都依赖该dll文件!!
走好每一步 2018-07-06
  • 打赏
  • 举报
回复
windows动态库知识:

静态库:只有lib文件
动态库:lib文件和DLL文件
静态链接,就是编译程序的把lib文件链接到exe中,exe知道函数地址放在dll哪个地方了,调用的时候直接include头文件,然后就可以调用了。
动态链接,youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName"); 不需要lib,只要dll就可以了,也不用头文件。


MFC的静态链接:就是把MFC相关的动态库链接到exe中,电脑c:\windows\system32文件夹有没有mfc的动态库,程序都可以跑起来!
MFC的动态链接:如果电脑没有mfc的动态库,程序跑起来就会报缺少mfc dll文件
winows库链接:表明该exe不依赖MFC的动态库,只依赖windows自带的库。


千万不用把MFC的静态链接,和生成静态库混淆概念了,这是两个东西,很多网上的知识写的都不全的。
赵4老师 2018-07-06
  • 打赏
  • 举报
回复
《Windows PE权威指南》
赵4老师 2018-07-06
  • 打赏
  • 举报
回复
引用 21 楼 eisldkw 的回复:
[quote=引用 20 楼 zhao4zhong1 的回复:]
建议楼主学会使用dumpbin.exe查看lib,dll文件。


非常感谢,用过DEPENDS.EXE,请问 这个 dumpbin.exe 能得到相关文件的什么信息?[/quote]
C:\masm32\bin\dumpbin.exe
C:\MSVC20\BIN\DUMPBIN.EXE
C:\Program Files\Microsoft Visual Studio\VC98\Bin\DUMPBIN.EXE
C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe
C:\Program Files\Microsoft Visual Studio 8\VC\bin\dumpbin.exe
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe

C:\Program Files\Microsoft Visual Studio 10.0\VC\bin>dumpbin /?
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.

用法: DUMPBIN [选项] [文件]

选项:

/ALL
/ARCHIVEMEMBERS
/CLRHEADER
/DEPENDENTS
/DIRECTIVES
/DISASM[:{BYTES|NOBYTES}]
/ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
/EXPORTS
/FPO
/HEADERS
/IMPORTS[:文件名]
/LINENUMBERS
/LINKERMEMBER[:{1|2}]
/LOADCONFIG
/OUT:文件名
/PDATA
/PDBPATH[:VERBOSE]
/RANGE:vaMin[,vaMax]
/RAWDATA[:{NONE|1|2|4|8}[,#]]
/RELOCATIONS
/SECTION:名称
/SUMMARY
/SYMBOLS
/TLS
/UNWINDINFO
eisldkw 2018-07-06
  • 打赏
  • 举报
回复
引用 20 楼 zhao4zhong1 的回复:
建议楼主学会使用dumpbin.exe查看lib,dll文件。


非常感谢,用过DEPENDS.EXE,请问 这个 dumpbin.exe 能得到相关文件的什么信息?
老夏 2018-07-05
  • 打赏
  • 举报
回复
静态库是一个LIB文件,没有DLL文件。动态库是LIB文件+DLL文件。LIB用于编译,DLL用于运行。 静态库相当于代码包(实现隐藏代码),连接的时候引入代码。动态库的LIB相当于导出函数的列表。 静态库引用其他动态库的头文件也可能编译通过,但是引入的模块编译可能会编译不通过。
eisldkw 2018-07-05
  • 打赏
  • 举报
回复
引用 12 楼 zgl7903 的回复:
静态链接lib 需要“生成静态库”编译生成的LIB,否则Lib只不过提供一个导出函数列表,并不包含实体代码


非常感谢。
赵4老师 2018-07-05
  • 打赏
  • 举报
回复
建议楼主学会使用dumpbin.exe查看lib,dll文件。
schlafenhamster 2018-07-05
  • 打赏
  • 举报
回复

if ( HINSTANCE hUser = LoadLibrary( _T("User32") ) )
{
BOOL (WINAPI *pfnFlashWindowEx)(PFLASHWINFO pfwi);
(FARPROC&)pfnFlashWindowEx = GetProcAddress( hUser, "FlashWindowEx" );
eisldkw 2018-07-05
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
"youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName"); "
这句 叫 动态 连接,相当于 lib 文件,通常用于 无 lib 时 的 情况, 如 user32.dll中 没有 公开文档 的 函数


非常感谢。这问题是 针对 于 老夏老师所说的 动态库是LIB文件+DLL文件 而问的, 因为此段代码首先是用的DLL文件,而且没有用到LIB文件。
schlafenhamster 2018-07-05
  • 打赏
  • 举报
回复
"youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName"); "
这句 叫 动态 连接,相当于 lib 文件,通常用于 无 lib 时 的 情况, 如 user32.dll中 没有 公开文档 的 函数
eisldkw 2018-07-05
  • 打赏
  • 举报
回复
引用 15 楼 watersoft 的回复:
静态库是一个LIB文件,没有DLL文件。动态库是LIB文件+DLL文件。LIB用于编译,DLL用于运行。
静态库相当于代码包(实现隐藏代码),连接的时候引入代码。动态库的LIB相当于导出函数的列表。
静态库引用其他动态库的头文件也可能编译通过,但是引入的模块编译可能会编译不通过。


非常感谢,但我接触的项目中 象以下这种形式调用 DLL文件的就没有用到LIB文件呀

HINSTANCE hDllInst = LoadLibrary("MyApp.dll");
if(hDllInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC youFuntionNameAlias = NULL; // youFuntionNameAlias 函数别名
youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName");
// youFuntionName 在DLL中声明的函数名
if(youFuntionNameAlias)
{
youFuntionNameAlias(param1,param2);
}
FreeLibrary(hDllInst);
}
请问 LIB文件在这种形式中是不是不需要呀?
赵4老师 2018-07-03
  • 打赏
  • 举报
回复
引用 12 楼 zgl7903 的回复:
静态链接lib 需要“生成静态库”编译生成的LIB,否则Lib只不过提供一个导出函数列表,并不包含实体代码

一语中的!
zgl7903 2018-07-03
  • 打赏
  • 举报
回复
静态链接lib 需要“生成静态库”编译生成的LIB,否则Lib只不过提供一个导出函数列表,并不包含实体代码


schlafenhamster 2018-07-03
  • 打赏
  • 举报
回复
静态 路径 为 静态 连接
加载更多回复(10)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧