为什么C++链接器在构建期间需要库文件,即使我是动态链接?

Mik*_*kes 14 c++ linker gcc visual-c++

我有一个C++可执行文件,我正在动态链接几个库(Boost,Xerces-c和自定义库).

我明白为什么如果我选择静态链接这些库,我会要求.lib/.a文件(这里有相关的问题).但是,如果我动态链接这些外部库,为什么在链接我的可执行文件时需要提供相应的.lib/.so库文件?

Mic*_*ael 8

编译器不知道动态链接,它只知道通过其原型存在一个函数.链接器需要lib文件来解析符号.DLL的lib包含其他信息,例如函数所处的DLL以及它们的导出方式(按名称,按序列等).DLL的lib文件包含的信息比包含完整目标代码的lib文件少得多 - libcmmt我的系统上的.lib是19.2 MB,但msvcrt.lib是"仅"2.6 MB.

请注意,此编译/链接模型此时已接近40年,并且在大多数平台上都处于动态链接之前.如果它是今天设计的,动态链接将是一等公民(例如,在.NET中,每个程序集都有丰富的元数据,准确描述它导出的内容,因此您不需要单独的头文件和库.)

  • 所以,如果我理解正确:作为"隐式"动态链接的替代方法(在构建期间链接.lib,在运行时使用DLL) - 我可以通过使用(在Windows上)LoadLibrary()来"显式"链接到运行时加载DLL和GetProcAddress()以返回我正在调用的方法的函数指针.编写代码的代码更多,但在构建时我不需要.lib. (3认同)