在 C++ 程序上使用加载时或运行时动态链接时,如何在编译时解析引用?

Posted

技术标签:

【中文标题】在 C++ 程序上使用加载时或运行时动态链接时,如何在编译时解析引用?【英文标题】:How references are resolved at compile time when using load-time or run-time dynamic linking on C++ programs? 【发布时间】:2021-01-15 22:45:58 【问题描述】:

我想我的问题很简单,在程序上使用动态链接(加载时或运行时)时我看不到整个画面,因为我想知道链接器在编译时看到未解析的引用时的行为并执行找不到它们的任何定义(因为它们在 dll 文件中),但无论如何程序编译得很好,即使存在将在运行时解析的引用。

假设链接器需要在编译时解析每个引用才能正常运行(就像静态链接一样),所以当 dll 文件工作时,以某种方式,链接器说可以离开这些引用在运行时未解决(我想我们作为程序员告诉链接器用代码来思考,就像说一些函数在 dll 文件上,就像我们说编译器在使用前向声明时某些函数存在于某处) .

有人可以向我解释一下,当链接器在加载时和运行时动态链接中看到对 dll 文件的外部引用时,链接器在编译时的行为方式是什么?策略?

尤其是在 C++ 上处理 dll 文件时,我可以理解哪些代码片段告诉链接器这样做。

旁注:

我已经在 microsoft docs 和其他网站上进行了在线研究,但我完全不了解所有内容,所以我转向了这里。

【问题讨论】:

exe 文件的加载方式并不像人们想象的那么简单。也许这篇文章可以帮助澄清:Loading a DLL from memory » ~magog/public 来自 Remy Lebeau 的 This answer 很好地总结了这个过程,恕我直言。 【参考方案1】:

链接器在编译时看到未解析的引用时的行为

它不只是看到“未解决的引用” - 如果引用确实未解决,您会收到错误消息。它需要访问声明这些符号并让链接器知道从哪些库中获取它们的动态库(或者,在 Windows 上,所谓的导入库)。然后,链接器生成可执行文件,其中包含对提供这些符号的动态库的引用。

【讨论】:

以上是关于在 C++ 程序上使用加载时或运行时动态链接时,如何在编译时解析引用?的主要内容,如果未能解决你的问题,请参考以下文章

动态链接库的加载

liteos动态加载(十三)

ubuntulinux链接库

Shell 扩展:C/C++ 运行时 DLL 的静态链接与动态链接

当应用程序已在运行且使用 Firebase 动态链接时导航不起作用

Linux下C/C++动态库在运行时是怎样加载进来的