Static libraries
Static libraries
当我想调用一些Windows函数时,如MessageBox,我可以从user32.dll中导入它并调用(与LoadLibrary和GetProcAddress)。但是Visual c++也使用了一个静态库,所以我不需要手动加载dll和函数。它们是如何工作的?它们是否包含每次调用函数时调用LoadLibrary/GetProcAddress的包装器?
您所指的"静态库"实际上是一个导入库。这种类型的库包含记录,这些记录告诉链接器每个函数实际存在于哪个库中,并且本身不包含任何代码。链接器在可执行文件中创建导入记录,加载器在加载时解析这些记录。这修复了运行时使用的地址,因此您的代码不需要显式调用LoadLibrary
和GetProcAddress
。
不,它们只允许与dll使用静态链接。可执行文件包含从其他DLL文件中需要的函数列表,因此当加载可执行文件时,加载器解析该列表并使用LoadLibrary
和GetProcAddress
解析每个函数,将结果保存到静态表(IAT,导入地址表)。这只做一次。还有一个DLL的"延迟加载"的概念,只有当函数第一次被调用时才会解析地址,但它很少使用。
以这种方式,DLL的lib文件只包含构建该列表(导出函数的名称)所需的信息。
相关文章:
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- C++ MFC Libraries in Travis CI
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- static是如何使用ClassA::m_variable处理所有类对象的
- Ardunio Uart class & Libraries
- LNK2001:未解析的外部符号public:static类std::vector
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- Static libraries
- Static libraries