为什么我们在编译时需要共享库

2023-12-21

为什么我们需要在可执行文件的编译期间存在共享库?我的推理是,由于共享库未包含在我的可执行文件中并在运行时加载,因此在编译时不应需要它。或者我错过了什么?

#include<stdio.h>
int addNumbers(int, int); //prototype should be enough, no? 
int main(int argc, char* argv[]){
  int sum = addNumbers(1,2);
  printf("sum is %d\n", sum);
  return 0;
}

我有libfoo.so在我当前的目录中,但我将其名称更改为libfar.so发现编译时需要共享库,否则无法编译。

gcc -o main main.c -L. -lfoo gives main.c:(.text+0x28): undefiend reference to 'addNumber'

我认为只有共享库的名称就足够了。共享库本身不是必需的,因为它可以在 LD_LIBRARY_PATH 中找到并在运行时动态加载。除了共享库的名称之外还需要其他什么吗?


不需要任何东西compile时间,因为C有一个单独编译的概念翻译单位。但是,一旦所有不同的来源都被编译完毕,就该将所有内容链接在一起了。标准中没有共享库的概念,但它现在很常见,所以这里是如何common链接器收益:

  • 它在所有已编译的模块中查找具有已定义或仅声明的外部链接的标识符
  • 它在库(静态和动态)中查找已使用且未定义的标识符。然后它链接静态库中的模块,并存储动态库中的引用。但至少在类 Unix 上,它需要访问共享库以获取潜在所需的(声明的和未定义的)标识符,以确保它们已经定义或可以在其他链接库(无论是静态还是动态)中找到

这会生成可执行文件。然后在加载时,动态加载器知道所需的所有动态模块,并将它们与实际的可执行文件一起加载到内存中(如果它们尚不存在),并构建(虚拟)内存映射

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们在编译时需要共享库 的相关文章

  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我

随机推荐

  • 如何使用 Microsoft.Graph 将文件附加到 Sharepoint 中的项目

    Microsoft Graph Sharepoint api 允许更新列表项https developer microsoft com en us graph docs api reference beta api listitem upd
  • 1 和 0 的大字符串到 BitSet

    我有一个非常大的字符串 64 个字符 其中包含 1 和 0 样本 1001111111101010011101101011100101001010111000101111011110001000 我想要的只是将其转换为 BitSet var
  • 丰富 SparkContext 而不会引发序列化问题

    我正在尝试使用 Spark 处理来自 HBase 表的数据 这篇博文 http www vidyasource com blog Programming Scala Java Data Hadoop Analytics 2014 01 25
  • 在 Ubuntu 18.10 上安装 ROS Melodic

    I can t是唯一对 Cosmic 与 Wayland 和 Melodic 的组合感兴趣的人 我会坦白说 我似乎已经在 XPS 13 9370 上成功管理了此操作 或者至少安装脚本 最终 成功完成 然而 有一个非常棘手的解决方法 无论结果
  • 当 debug == 0 时如何手动刷新模型缓存?

    每当我在 CakePHP 站点的生产版本上对数据库进行更改 其中调试设置为 0 时 这些更改都不会反映出来 我知道我可以通过暂时将 debug 更改为 2 来解决此问题 但是当大量人访问此站点时 这似乎不安全 我查看了缓存文件 但由于尚无相
  • VS Code 中的 Node.js TypeScript 调试

    有人可以提供 VS Code 配置的示例吗 它允许我 启动 Node js 调试器 编辑任何 TS 文件 看到项目重新编译并重新启动调试器吗 这是开箱即用的支持吗 能nodemon以某种方式被使用 谢谢 是的 您可以使用nodemon 在您
  • 如何加载 ace 编辑器

    我正在尝试使用 Ace 代码编辑器库 http ace ajax org http ace ajax org 但我遇到了麻烦 根据嵌入指南 这应该从 Amazon CDN 加载所需的 js 文件 然而它失败了 在 Chrome 控制台中显示
  • 通过智能 HTTP 推送到 Git 共享存储库的权限不足

    我正在尝试为我们的团队评估 git 要求之一是使用 HTTPS 作为传输方法 我一直在努力遵循git http 后端 http www kernel org pub software scm git docs git http backen
  • 交互式保存文件?

    Using tk choose files or file choose我能够交互式地选择一个文件 是否有一个类似的函数 我可以允许用户交互地决定在哪里保存 write table 的输出 在 Windows 7 上并通过 RGUI 工作
  • 将 MediaElement 绑定到 WPF 中的滑块位置

    尝试将滑块的最大值绑定到媒体元素的持续时间并将滑块的当前值绑定到媒体元素的位置 但由于某些原因它没有 我希望滑块在视频播放时移动拇指
  • ReferenceError:使用 Performance.now() 时未定义性能

    我收到错误ReferenceError performance is not defined当尝试使用时性能 now https developer mozilla org en US docs Web API Performance no
  • Kafka AVRO - 从长时间到日期时间的转换

    当我想要发送包含 long 类型字段的 AVRO 消息时 出现以下错误 Caused by org apache kafka common errors SerializationException Error deserializing
  • 仅特定路由或控制器需要 SSL 客户端证书

    我有一个使用 Kestrel 作为服务器的 ASP NET MVC Core 项目 它既提供用户内容 asp net mvc 又托管与代理 软件 通信的 Web API 控制器 我已启用 HTTPS 和客户端证书支持 问题是我想要调用 We
  • 将 excel 的动态文件路径传递给“OPENROWSET”

    我想将 excel 的动态 URL 传递给 OPENROWSET 注意 我将 Excel 文件的返回结果传递给光标 我想将文件路径传递给 excelpath 我尝试了很多方法 但它给出了语法错误 ALTER procedure dbo im
  • Android.mk - 包含 OpenCV 目录,用于使用 NDK 进行本机 C++ 编译

    我正在使用 NDK 将 C OpenCV 代码导入到 Android 应用程序中 首先 我必须说 我没有学过编程 我只是一个业余开发人员 所以有很多事情我无法管理 特别是编码之外的事情 我使用 QtCreator 来编写 C OpenCV
  • Subversion 与 CVS [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 用于从视频源(网络摄像头)发出新帧信号的 Gstreamer 消息

    我正在尝试使用 gstreamer 将网络摄像头的流保存为一系列图像 到目前为止我已经写了这段代码 usr bin python import sys os import pygtk gtk gobject import pygst pyg
  • Symfony2 - 如何在 EventListeners 中使用数据转换器

    我需要使用事件侦听器 因为我需要在表单中显示不同的内容 无论它是新实体还是已存在的实体 我可以做到这一点 我需要一个数据转换器 将实体显示为文本 这也是我可以做的 gt 但是 我无法同时执行 2 个操作 数据转换器 事件监听器 我收到错误
  • 在android中用canvas绘制四分之一规? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我怎样才能创建与此相同的仪表 是否存在这种仪表类型的库或 Maven 我使用画布作为圆规 但我无法创建
  • 为什么我们在编译时需要共享库

    为什么我们需要在可执行文件的编译期间存在共享库 我的推理是 由于共享库未包含在我的可执行文件中并在运行时加载 因此在编译时不应需要它 或者我错过了什么 include