在使用没有代码的静态库时,VC ++是否会添加对LoadLibrary的调用?

时间:2016-01-17 09:55:01

标签: c++ visual-c++

请原谅我对静态库的命名,但我的意思是讨论没有代码的静态库(.lib),而只讨论可能是通过获取dll并使其成为导入库而生成的引用。

我是否正确理解编译器(MSVC ++)在这种情况下添加了类似LoadLibrary(“foo.dll”)的代码; GetProcAddress的( “barMethod”);在c ++代码中引用时?

有没有办法确定它是否确实如此?

也许使用某种静态分析工具会告诉我生成了什么代码?

2 个答案:

答案 0 :(得分:4)

静态库有代码。没有代码的.lib文件不是静态库,而是 import 库(正如您正确观察到的那样)。

在这种情况下,VC ++可以做两件事。默认设置是将导入库编译到导入地址表(IAT)中。在运行时,操作系统将解析引用。替代方案称为延迟负载链接。在这种情况下,VC ++确实会插入对LoadLibrary和GetProcAddress的调用。

Dependency Walker仍然是观察这一切是如何运作的相关工具。

答案 1 :(得分:1)

如果您将程序与某些库(.lib)链接,该库只是某些.dll的导出库,编译器不会调用(或添加一些此类代码)任何LoadLibrary或smth 。它不依赖于您使用的编译器。

在您的应用程序启动时,操作系统(如果使用导入库的静态链接)始终加载.dll(编辑:延迟加载链接除外)。编译器只创建必须从.dll加载的名称列表。此列表名为import table