VC++ 在使用没有代码的静态库时是否会添加对 LoadLibrary 的调用?
Does VC++ add calls to LoadLibrary when using static libraries that don't have code?
请原谅我对静态库的命名法,但我的意思是谈论没有代码的静态库(.lib),而只是通过获取dll并使其成为导入库生成的引用。
我是否正确理解编译器 (MSVC++) 在这种情况下添加了类似 LoadLibrary("foo.dll")的代码;GetProcAddress("barMethod");何时在 C++ 代码中引用?
有没有办法确定它是否真的这样做?
也许使用某种静态分析工具来告诉我生成了什么代码?
静态库有代码。没有代码的 .lib 文件不是静态库,而是导入库(正如您正确观察到的那样)。
在这种情况下,VC++可以做两件事。默认设置是将导入库编译为导入地址表 (IAT)。在运行时,操作系统将解析引用。另一种称为延迟-负载链接。在这种情况下,VC++确实会插入对LoadLibrary和GetProcAddress的调用。
依赖 Walker 仍然是观察这一切如何工作的相关工具。
如果将程序与某些库 (.lib) 链接,而该库只是某些.dll的导出库,编译器不会调用(或添加此类代码的某些代码)任何 LoadLibrary 或 smth。它不取决于您使用的编译器。
.dll始终在应用程序启动的那一刻由操作系统加载(编辑:延迟加载链接的情况除外)(在使用导入库的静态链接的情况下)。编译器仅创建必须从.dll加载的名称列表。此列表称为导入表。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 是否将std::packaged_task添加到现有线程
- 将常量字符串添加到非常量字符串是否会给出常量字符串
- 这种方式是否可以接受向向量添加unique_ptr?
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 在 Eclipse 中添加库的工作方式是否与在 Visual Studio 中相同?
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 检查数组中是否有字符串中的值,如果没有,则添加它
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- 是否可以在 for 循环中添加两个浮点数?
- 在迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间访问?
- 是否允许向空指针添加零?
- 检测是否在 QTableWidget 中添加或删除了列
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 添加noexcept是否会破坏二进制兼容性
- 弄清楚使用emplace_hint时是否添加了项目
- cin函数是否添加了在输入结束时终止的null
- 如何在unordered_map中设置值并查明是否添加了新键
- AES_cbc_encrypt是否添加填充
- C++11是否添加了C99限制说明符?如果没有,为什么不呢