静态库、动态库及导入库

静态库

    1. 静态库扩展名为.lib,静态链接(即代码会直接编译进可执行文件)。静态库是一个或多个obj文件的打包。

    2. 在VC中使用静态库的方法:

    方法一:在项目属性中添加附加依赖项。

        若库目录不在系统和当前目录,选中工程,单击右键,属性-->VC++目录,在库目录中添加库文件所在路径;

        选中工程,单击右键,属性-->链接器-->输入,在"附加依赖项“右边选择编辑,输入要包含的静态库名称。

    方法二:在项目中直接添加库文件。

        选中工程,单击右键,添加-->现有项,在弹出的对话框中选择想要添加的静态库,点击确认。

    方法三:使用pragma预处理指令。如:      

#pragma comment(lib, ".../lib/test.lib")

    利用上述方法导入静态库后,就可在源码文件中包括.h文件,然后在源码文件中使用静态库函数。

    3. 在VC中生成静态库:

       选中工程,单击右键,属性-->常规,在"目标文件扩展名"后输入.lib,在"配置类型"中选择"静态库(.lib)"

动态库和导入库

    1. 和静态库不同,动态库不会编译进可执行文件中,多个程序引用动态库时,内存中实际只会有一份动态库的内容。

        用VC创建动态库时,实际生成两个文件,一个lib文件和一个dll文件,这个lib文件就是导入库。

        导入库是动态库的辅助库,导入库中不含代码,而是为链接程序提供信息,包含在.exe文件中建立动态链接时要用到的重定位表。

        导入库用于程序开发时,动态库用于程序运行时。

    2. 在项目中使用动态库的方法:

        方法一:  隐式加载: 这种方式和静态库的使用方法一样,对应有3种具体的方法,注意此时要包含的是导入库而不是动态库,依然需要头文件,代码中可直接使用头文件中的函数名,并且这种方式在运行时需要需要动态库。

        方法二:  显式加载(又称运行时动态链接):在代码中使用LoadLibrary()显式打开dll文件,使用GetProcAddress获取函数地址然后使用,使用完之后用FreeLibrary显式释放dll文件。这种方式不需要导入库及.h文件。

        使用隐式加载时,如果进程在启动时未找到dll,则操作系统将终止此进程。但使用显式加载时则进程不会被终止。

    3. 在VC中生成动态库和导入库:

        选中工程,单击右键,属性-->常规,在"目标文件扩展名"后输入.dll,在"配置类型"中选择"动态库(.dll)"

        注意: 对于要导出给外部程序使用的函数及数据,均应具有_declspec(dllexport)。如果dll源码中没有一个_declspec(dllexport),则不会生成导入库。

    4. DllMain函数:

        DllMain函数为dll的入口函数,该函数不是必须的。该函数在dll被加载进程地址空间时运行(即隐式加载时,在main()函数执行之前就已经运行;显式加载时,在LoadLibrary时运行)。


参考资料:

http://blog.chinaunix.net/uid-24517893-id-2495060.html

http://www.cnblogs.com/qinfengxiaoyue/archive/2012/05/27/2519703.html

关于DllMain()的详细说明,可参考:

http://blog.csdn.net/kroosafe/article/details/3454840



  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态库动态库在编译和运行时的行为有所不同。静态库在程序编译时会被连接到目标代码中,而动态库则是在程序运行时才被载入。 静态库对应的lib文件叫做静态库,而动态库对应的lib文件叫做导入静态库本身包含了实际执行代码、符号表等信息,而导入只包含了地址符号表等,用于确保程序能够找到对应函数的基本地址信息。\[1\] 静态库的大小通常比较大,因为它包含了实际执行代码和其他必要的信息。而动态库的大小相对较小,因为它只包含了地址符号表等基本信息。\[1\] 使用静态库的程序在编译时会将静态库的代码复制到最终的可执行文件中,因此可执行文件会比较大。而使用动态库的程序在编译时只会包含对动态库的引用,而不会将动态库的代码复制到可执行文件中。这样可以减小可执行文件的大小,并且多个应用程序可以共享同一个动态库的实例,避免了空间浪费。\[3\] 另外,动态库的使用还解决了静态库对程序的更新、部署和发布带来的麻烦。当需要更新动态库时,只需要替换动态库文件即可,而不需要重新编译整个程序。这样可以实现增量更新,方便程序的维护和升级。\[3\] 综上所述,静态库动态库的主要区别在于编译时和运行时的行为不同,静态库在编译时被连接到目标代码中,而动态库在程序运行时才被载入。此外,静态库会增加可执行文件的大小,而动态库可以实现共享和增量更新。 #### 引用[.reference_title] - *1* *2* [静态库动态库的区别](https://blog.csdn.net/sinat_16643223/article/details/114027857)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [详谈静态库动态库的区别](https://blog.csdn.net/weixin_71478434/article/details/126588174)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值