首页
社区
课程
招聘
[原创]DLL, lib静态、动态库
发表于: 2014-8-21 00:13 11877

[原创]DLL, lib静态、动态库

2014-8-21 00:13
11877
收藏
免费 3
支持
分享
最新回复 (27)
雪    币: 817
活跃值: (2063)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
      windows 标准的动态链接库是按 PASCAL(或__stdcall)调用规则输出函数的,但是,一般编译器在编译这种规则源程序的时候,会改变输出函数的名称。例如,如果你定义了一个准备供调用的函数Function(int , int),在无人为干预的情况下,在编译完成的dll中,输出的实际函数名将会变成“_Function@8”这个样子,如果用户按"Function(int , int)"的定义来调用这个dll的时候,就会因为找不到这个函数而出错,为了保持输出函数名称不变,在编译生成dll和lib库文件的时候才需要这个def文件,对 lib 和 dll 库文件中的输出函数名进行纠正。如果你的动态链接库没有特别指定按 PASCAL(_stdcall) 规则调用函数,编译器会按照缺省的 C 语言调用规则处理,函数名将不会有任何改变。因此,在这种情形下,根本就没必要使用 def 文件对输出函数名进行干预。总起来说,def文件主要用于编译 lib 和 dll 库文件的过程,2 个库文件一旦得到,def 文件便无用了。
    “kernel32.lib”和“kernel32.dll”属于WindowsSDK,是微软专门提供给用户调用Win32API系统功能的接口,凡是需要调用库中系统功能的程序,只需要链接“kernel32.lib”就能实现和“kernel32.dll”动态链接。可以肯定地说,这两个库不属于 vc 系统,而 vc 里面之所以有这 2 个库也只是为用户调用 Win32API 提供方便而准备的。如果 vc 不提供这 2 个库,那么,用户恐怕就没有办法直接调用 kernel32.dll 中的Win32API 功能了!
2014-8-24 00:16
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
如果 vc 不提供这 2 个库,那么,用户恐怕就没有办法直接调用 kernel32.dll 中的Win32API 功能了!

请问,为什么?

我知道,我们一般使用 kernel32.dll的函数,几乎不是以loadlibrary的方式,而是以静态链接。

所以需要kernel32.lib这个文件。

安装多个vc版本,会提供不同的kernel32.lib,

会不会引入新问题: 不同版本的的kernel32.lib, 和同一个kernel32.dll 进行搭配。

不会有问题吗?

一般安装一些开发包,比如sdk 这些包, 或者 vc开发工具后,

都会引入kernel32.lib。

我们程序发布的时候,肯定是不会发布kenrel32.dll。
2014-8-27 10:20
0
雪    币: 817
活跃值: (2063)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
    kernel32.lib 只是一座桥,方便我们把自己的代码和微软的代码链接在一起,不管 kernel32.lib 怎么变,这个作用不发生一丝一毫的改变。可以这样说,不管什么开发系统,只要提供 kernel32.lib,都可以正常使用,而且用法完全一样。道理很简单,kernel32.dll 属于操作系统,而不属于任何开发系统。
2014-8-27 11:38
0
游客
登录 | 注册 方可回帖
返回
//