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

     2023-02-22     183

关键词:

【中文标题】在 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 上,所谓的导入库)。然后,链接器生成可执行文件,其中包含对提供这些符号的动态库的引用。

【讨论】:

动态链接库的加载

 隐式加载:  隐式加载又叫载入时加载,指在主程序载入内存时搜索DLL,并将DLL载入内存。隐式加载也会有静态链接库的问题,如果程序稍大,加载时间就会过长,用户不能接受。 显式加载:  显式加载又叫运行时... 查看详情

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

】当应用程序已在运行且使用Firebase动态链接时导航不起作用【英文标题】:NavigationnotworkingwhentheappisalreadyrunningandFirebaseDynamicLinksareused【发布时间】:2020-07-1912:44:22【问题描述】:如果应用程序是使用动态链接打开的,我有这个... 查看详情

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

...inux上,你在ps中说的那种"将动态库作为一个参数传到程序里"的使用方式,是通过dlopen函数将.so加载到当前进程中,并且通过ld.so将.so"链接"进当前进程。这个"链接"过程包括:查找未定义符号在当前进程中... 查看详情

liteos动态加载(十三)(代码片段)

1.概述1.1基本概念动态加载是一种程序加载技术。静态链接是在链接阶段将程序各模块文件链接成一个完整的可执行文件,运行时作为整体一次性加载进内存。动态加载允许用户将程序各模块编译成独立的文件而不将它们链接起... 查看详情

在运行时动态加载 django 应用程序

】在运行时动态加载django应用程序【英文标题】:dynamicallyloadingdjangoappsatruntime【发布时间】:2014-07-2412:58:23【问题描述】:是否可以在运行时动态加载Django应用程序?通常,应用程序在初始化时加载,使用settings.py中的INSTALLED_AP... 查看详情

如何在 C++ 和 Qt 中使用在运行时加载的库

...【问题描述】:我目前有一个在桌面和手机上运行的应用程序。桌面版需要功能齐全的libfoo.so,而移动版只需要libfoo.so的一小部分。其他人已经实现了libfoo-phone.so,它使用与libfoo.so相同的函数名来表示它实际实现的函数。我 查看详情

当我在 Linux 上使用 STL 编译 C++ 程序时,STL 库是如何链接的?

】当我在Linux上使用STL编译C++程序时,STL库是如何链接的?【英文标题】:WhenIcompileaC++programonLinuxusingtheSTL,howistheSTLlibrarylinked?【发布时间】:2013-11-1216:12:34【问题描述】:当我使用g++编译使用STL的程序时,库如何链接到我的程序... 查看详情

动态链接及静态链接

...链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些。动态链接就是在编译的时候不直接拷贝可执行代码... 查看详情

c++中lib和dll的区别,生成以及使用详解

...生一个.lib文件动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL包含... 查看详情

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

...3109:40:13【问题描述】:在构建WindowsExplorershell扩展(目前使用VS2010SP1)时,您是否建议static-linking(用于CRT、C++运行时和其他支持库,如AT 查看详情

使用 ajax 在引导模式上加载动态图像

】使用ajax在引导模式上加载动态图像【英文标题】:Loadingdynamicimagesonanbootstrapmodalwithajax【发布时间】:2019-09-1121:22:32【问题描述】:当用户单击页面上的不同链接时,我/m尝试。每个链接都有一个data-id,用于在模态正文中显示... 查看详情

是否可以在运行时从 Android 应用程序动态加载库?

】是否可以在运行时从Android应用程序动态加载库?【英文标题】:IsitpossibletodynamicallyloadalibraryatruntimefromanAndroidapplication?【发布时间】:2011-10-1500:40:24【问题描述】:有没有办法让Android应用程序在运行时下载和使用Java库?这是... 查看详情

在设备上构建和运行时,仅将嵌入式框架与其他动态框架链接失败

...式框架与其他框架链接,并且不要将其他框架与您的应用程序链接,因为在设备上构建和运行时requiredcodesign 查看详情

c++动态内存

了解动态内存在C++中是如何工作的是成为一名合格的C++程序员必不可少的。C++程序中的内存分为两个部分:栈:在函数内部声明的所有变量都将占用栈内存。堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。很... 查看详情

编写动态链接库(代码片段)

...库是指编译代码时即将整个库编到可执行文件中,此时该程序完全拥有库所实现的功能,即运行时不再和库有任何瓜葛。动态链接库则不一样,编译时只是将库中所用到的函数和功能的入口地址编译到可执行文件中,当程序执行... 查看详情

在运行时动态加载库时出现“未解析的外部符号”错误

...】:我有一个大项目,其中生成了一个可执行文件A.exe(使用cmake工具链)以动态加载B.dll在运行时。但是如果没有与B.dll的编译时链接,我在构建可 查看详情

动态负载库和运行时误解的显式链接

...DLL。我创建了其中一个,并且我可以成功地将我的客户端程序链接到DLL。但我有一个误解。当我阅读DLL时,有一句话强调当DLL加载到内存中时,所有程序实例都可以使用它。所以它导致我们有效地 查看详情

在 C++ 运行时动态创建类对象

...未指定数量的对象要创建,我完全迷失了。有人告诉我要使用指针来执行此操作,但即使使用指针我也不知道该去哪里。这是我的代码。#include<iostream>#include<string& 查看详情