VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1011|回复: 9

动态库调用问题!

[复制链接]

2

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-4 23:30:01 | 显示全部楼层 |阅读模式
请问调用.dll,.lib文件时,什么情况下两个文件都需要?什么情况下只要lib文件就够了?只用.lib时跟.lib,.dll都用时调用上有些什么区别啊??有点弄不清楚了
回复

使用道具 举报

0

主题

45

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-3-23 10:45:01 | 显示全部楼层
dll是动态加载

lib是静态库
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-3-23 11:45:01 | 显示全部楼层
1.只用lib,只静态调用。
2.lib,dll,动态调用lib作为连接文件。

现在一般多用lib,dll方式,也就是用dll方式这样程序占用空间小容易升级。

另外,动态调用dll使用lib文件只是一种方法而已,可使用loadlibrary就不用lib文件了。
回复

使用道具 举报

0

主题

59

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-3-24 20:15:01 | 显示全部楼层
1.隐式调用需要LIB & DLL,显式加载只需要DLL和函数原形就行了.
2.在静态连接情况下可仅提供lib文件就行了.
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-26 09:00:01 | 显示全部楼层
楼上两位总结的很全面.
回复

使用道具 举报

5

主题

17

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-3-27 01:45:01 | 显示全部楼层
动态库的链接分为隐式和显示两种

隐式的:需要包含导出函数/C++类声明的头文件
       导入库文件.lib
       实际的DLL(.dll文件)

显示的: 只需要用LoadLibrary /  GetProcAddress  /  FreeLibrary
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-3-27 11:45:02 | 显示全部楼层
只用dll时,要用函数加载dll;一般使用LIB & DLL,只需在头文件中加 #pragma comment(lib,"connserverd.lib") 方便。
回复

使用道具 举报

0

主题

59

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-4-14 09:45:01 | 显示全部楼层
显试加载:#pragma comment(lib, "xxx.lib")
隐式加载,VC 7X环境:
-Project
-Properties
-Linker
-Input
-Additional Dependencies:键入你的xxx.lib
回复

使用道具 举报

2

主题

19

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-4-20 23:00:01 | 显示全部楼层
对静态联接时,只要.lib,无dll
运行时也不存在.lib和.dll

对动态联接时有两种方式
1.编绎时要.lib和对应包含函数声明的头文件;运行时不用.lib,而要用.dll
2.如果在程序中按寻址方式使用dll,要求在dll创建时,应在.def文件中声明函数名.这样就不需要.lib和.h文件
寻址方式示例
LONG      lResult;
   HINSTANCE hModule;
   //建立一个新函数指针数据类型
   typedef LONG (MULTIPLY2LONGSPROC)(LONG, LONG);
   MULTIPLY2LONGSPROC* pfuncMultiply2Longs = 0;
    // 导入文件DYNLINK1.DLL,文件应同EXE文件在同一目录或在WINDOWS\SYSTEM\目录中
   VERIFY(hModule = ::LoadLibrary("DYNLINK1.dll"));
   //得到DLL中函数Multiply2Longs()的地址
   VERIFY(
      pfuncMultiply2Longs =
         (MULTIPLY2LONGSPROC*)::GetProcAddress(
            (HMODULE) hModule, "Multiply2Longs")
   );
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-14 10:00:02 | 显示全部楼层
动态库升级方便,按需加载,不占内存(不用的时候),静态库没有运行时加载的负担,但是一开始就加进去了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表