gcc 链接共享库与符号链接

2023-11-27

我有两个库,例如两个烤面包机库libtoaster_a.so and libtoaster_b.so以及所有相关的主要/次要/修订符号链接,例如libtoaster_a.so.1.0.0等等。这两个库都实现了相同的烤面包机接口,但只是进行了不同的处理。因此,当我构建一个使用该库的应用程序时,使用哪个库并不重要(从应用程序的角度来看,它们是相同的)。

因为我想在应用程序编译和分发后决定使用哪个库,所以我创建了一个符号链接libtoaster.so这指向libtoaster.so.1然后可以指向libtoaster_a.so.1 and libtoaster_b.so.1。因此,用户/安装人员可以简单地更改libtoaster.so.1用于选择要使用的实现的链接。

对于构建说我有libtoaster.so.1链接到libtoaster_a.so.1默认情况下。当我编译我的应用程序时,例如:my_app通过类似的东西gcc -o my_app -ltoaster...它编译甚至运行libtoaster_a.so.1正确。但是,如果我在 my_app 上运行 ldd,我会看到它链接到libtoaster_a.so.1而不是libtoaster.so.1根据需要,因此改变libtoaster.so.1链接没有效果。

有没有比制作更好的方法来解决这个问题libtoaster_a.so.1,将其重命名为libtoaster.so.1,针对该库制作 my_app 然后删除libtoaster.so.1并再次将其创建为符号链接?


当您构建共享库时,将“-Wl,-soname=libtoaster.so.1”添加到 gcc 标志中(假设您正在与 gcc 链接)。这会在库中设置 DT_SONAME,并将强制与该库链接的任何应用程序从 DT_SONAME 获取库名称,而不是从文件名称获取。

[vps@manticore]~/cprog/toaster1$ gcc -c my_app.c
[vps@manticore]~/cprog/toaster1$ gcc -c toaster.c
[vps@manticore]~/cprog/toaster1$ gcc -o libtoaster_a.so -shared -Wl,-soname=libtoaster.so toaster.o
[vps@manticore]~/cprog/toaster1$ gcc -R$(pwd) -L. -ltoaster_a -o my_app my_app.o
[vps@manticore]~/cprog/toaster1$ ldd my_app
my_app:
my_app: can't load library 'libtoaster.so'
my_app: exit status 4
[vps@manticore]~/cprog/toaster1$ ln -s libtoaster_a.so libtoaster.so
[vps@manticore]~/cprog/toaster1$ ldd my_app
my_app:
    Start    End      Type Open Ref GrpRef Name
    1c000000 3c004000 exe  1    0   0      my_app
    05b1f000 25b23000 rlib 0    1   0      /home/vps/cprog/toaster1/libtoaster.so
    084f9000 28532000 rlib 0    1   0      /usr/lib/libc.so.51.0
    09e80000 09e80000 rtld 0    1   0      /usr/libexec/ld.so
[vps@manticore]~/cprog/toaster1$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc 链接共享库与符号链接 的相关文章

随机推荐

  • 如何像 Instagram 和 Vine 一样在 ListView 中播放视频?

    我是 Android 开发新手 我正在尝试在列表视图中播放多个视频 目前 每个列表视图行项目都是一个视频视图 这种方法不起作用 因为当我开始滚动时 VideoViews 表现异常 我研究过here here here并发现VideoView
  • 获取绘图的只读属性名称列表

    如果要通过属性结构复制绘图 则需要过滤掉只读属性 例如 Annotation BeingDeleted Parent Type 有没有办法获取对象的只读属性列表 该问题源自一个相关问题 如何从绘图处理程序中绘图 我开始研究上一个问题 尝试动
  • 按行比较矩阵与向量中的元素

    我想将矩阵的值与相应的向量进行比较 比较应该按行进行 矩阵示例 ret TLT VTI 1995 01 20 0 005649718 0 004461441 1995 01 23 0 002840909 0 002560820 1995 0
  • 如何在 AWS Elastic Beanstalk 上使用 Resque 运行 Rails 后台作业?

    我正在运行我的 Rails 应用程序AWS 弹性豆茎平台 它运行具有 Auto Scaling 和 Elastic Load Balancing 的单个 EC2 实例 我想知道怎么跑resque delayed job or sidekic
  • mysql联合不同列数

    我知道联合查询必须具有相同数量的列 我正在尝试从表中获取结果comments以及表中的结果strings 它有多个连接 我如何正确地做到这一点 我还没有测试过 因为我知道我会收到不同数量的列的错误 这是我试图合并的两个查询 查询1 字符串
  • 如何使用TreeStore或TreeEditor组件更新数据?

    我使用 tree Panel 和 TreeStore 组件 我使用 JSON 文件来存储我的数据 但我想知道如何使用 TreeStore 升级我的数据 我解释我的问题 我的页面上有 2 个组件 Tree Panel用TreeStore和Pa
  • LinkedIn 的访问令牌更新流程可以在服务器上执行吗?

    在 Facebook 的 Graph API 中 一旦我们初步验证了用户身份 我们就可以直接与 API 从服务器 进行交互 以获得长期存在的页面访问令牌 这个长期存在的页面访问令牌永远不会过期 https developers facebo
  • 在 python opencv 中为像素着色

    我需要为图像中的像素着色 我使用opencv和python 我试过img x y 255 255 255 给一个上色pixel x y 但它不会工作 这其中是否有什么错误呢 你能建议任何方法吗 提前致谢 img x y 255 255 25
  • IF EXISTS UPDATE ELSE INSERT 语法错误

    我正在使用由我的 ISP 托管的 MySQL 5 1 这是我的查询 mysql query IF EXISTS SELECT FROM licensing active WHERE title 1 title 1 THEN BEGIN UP
  • 从内容页设置母版页上的属性值

    每次加载页面时 我都需要将数据传递给母版页中的变量 我在每个内容页面上设置了一个RequiredRoles 字符串 定义了访问该页面所需的角色 在我的母版页上 我有一种方法可以获取该数组 并检查当前用户是否属于这些角色中的一个或多个 我将如
  • 方法重载装饰器

    我正在尝试编写一个为 python 提供方法重载功能的装饰器 类似于中提到的PEP 3124 我编写的装饰器非常适合常规函数 但我无法让它适用于类中的方法 这是装饰器 class Overload object def init self
  • UI Router Extras 破坏了我的单元测试并出现意外结果错误?

    问题 安装 ui router extras 不是普通的 ui router 时 为什么我的测试失败 我该如何使用ui router extras我的测试仍然通过吗 如果你想快速安装 请使用 yeoman angular fullstack
  • 如何向单个客户端而不是所有客户端发送命令?

    我正在用 Indy 10 编写一个简单的客户端 服务器聊天程序 我的服务器 idtcpserver 向客户端发送一条命令 客户端应答 但是当连接多个客户端并且服务器发送命令时 all连接的客户端向服务器发送数据 如何向指定客户端而非全部客户
  • 限制 API 调用。仅允许我的移动应用程序

    我想要我的网络服务器接受请求起源仅从我的移动应用 由于移动应用程序是客户端应用程序 这意味着用户可以拥有二进制文件并反编译它 或者使用 Fiddler 等工具来解释 API 调用并重建它们 例如 在控制台应用程序中 所以我想要的是一种方法生
  • 有哪些好的方法可以防止 JavaScript 多人游戏作弊?

    想象一个带有滚动关卡的太空射击游戏 有哪些方法可以防止恶意玩家修改游戏以谋取私利 他可以做的服务器端难以限制的事情是自动瞄准 在可见区域外窥视 加速黑客攻击和其他事情 有哪些方法可以防止这种情况发生 假设服务器是任何语言 并且客户端通过 W
  • 故障模块:kernelbase.dll。应用程序崩溃

    I Have an application done in Net framework 3 5 C Net I installed the application in Windows 7 But while opening some fo
  • Enum.IsDefined 带有标记的枚举

    我目前正在看书C 4 0 简而言之顺便说一句 我认为这是一本很棒的书 即使对于高级程序员来说也可以作为很好的参考 我回顾了有关基础知识的章节 发现了一个技巧 可以在使用标记枚举时判断枚举中是否定义了某个值 书中指出 使用Enum IsDef
  • 为什么大写字母不能用于定义值的模式匹配?

    为什么我可以使用小写字母作为名称 val a bC 1 2 1 2 match case a bC gt 并且不能使用大写字母 compile errors not found value A BC val A BC 1 2 compile
  • Django + PostgreSQL:填充范围内缺失的日期

    我有一张表 其中一列为date 每个日期可以有多个条目 date 2015 07 20 2015 07 20 2015 07 23 2015 07 24 我想使用 Django ORM 和 PostgreSQL 作为数据库后端来获取以下形式
  • gcc 链接共享库与符号链接

    我有两个库 例如两个烤面包机库libtoaster a so and libtoaster b so以及所有相关的主要 次要 修订符号链接 例如libtoaster a so 1 0 0等等 这两个库都实现了相同的烤面包机接口 但只是进行了