如何使我的应用程序链接库与其位置无关?

2023-12-29

我建立了一个共享库(即libabc.so)和一个可执行文件(即myapp)它使用我的共享库。我已将共享库和可执行文件都放置在文件系统中,但是当我运行可执行文件时,出现以下错误

error while loading shared libraries: <target_lib_path>/<mylib>.so cannot open shared object file: No such file or directory.

现在我的开发环境是我有一个不同的目标文件系统,它位于~/targetfs构建我的共享库后,我将其安装在~/targetfs/usr/local/abc/lib。在链接我的应用程序期间我给出了它

LDFLAGS += -L~/targetfs/usr/local/abc/lib 

我的应用程序构建得很好。但是当我在一个环境中运行我的应用程序时~/targetfs是我的文件系统,然后我的应用程序抱怨 加载共享库时出错:

/home/user/targetfs/usr/local/abc/lib/libabc.so: can not open shared object file. No such file or directory exist.

现在,当然,我的应用程序正在搜索不存在的共享库的路径,但我希望我的应用程序独立于该路径,而应该在中查找我的共享库/lib, /usr/lib, /usr/local/lib or LD_LIBRARY_PATH地点。

如何使我的应用程序链接库与其位置无关?

下面给出了我的共享库和应用程序的 Makefile。

-------------- 共享库 makefile。 (省略不必要的信息)

CC              = $(CROSS_COMPILE)gcc
CFLAGS          = -Wall -shared -fpic
LDFLAGS         = -Xlinker --gc-sections --allow-shlib-undefined
LIBRARY         = libabc.so
OBJ_DIR         = obj
SRC_DIR         = src
CHK_DIR_EXISTS  = test -d
MKDIR           = mkdir -p

# Project Source Files
C_SOURCES += $(SRC_DIR)/abc.c
OBJECTS   += $(OBJ_DIR)/abc.o
INCLUDES  += -Iinc                               
$(LIBRARY): $(OBJECTS)
    @echo ""
    @echo "Linking..." $(LIBRARY)
    @$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o $(OBJ_DIR)/$(LIBRARY) 

---------- 应用程序Makefile(省略不必要的信息)

LDFLAGS += $(TARGETFS)/usr/local/abc/lib/libabc.so           \
       -lpthread -lrt

有什么想法我的 Makefile 中缺少什么吗?


您可以要求链接器将多个搜索路径放入二进制文件中。您可以使用 -Wl,rpath=... 选项引入这些搜索路径。

gcc -o abc abc.c 
-L~/targetfs/usr/local/abc/lib 
-labc 
-Wl,-rpath=/usr/local/abc/lib 
-Wl,-rpath=...
-Wl,-rpath=...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使我的应用程序链接库与其位置无关? 的相关文章

随机推荐

  • QMake:使用相对路径引用库

    我有一个使用 SQLite 的 Qt 项目 所以我有以下目录结构 C Workspace MyProject MyProject pro C Workspace MyProject sqlite3 sqlite3 lib 添加带有绝对路径的
  • 隐藏 asp.net WebMethod 返回的异常的堆栈跟踪?

    我在我的 aspx 页面中使用带有属性 WebMethod 的方法 我不使用任何 asp net ajax 而是使用 jQuery 来调用这些方法并返回 JSON 中的对象 这一切都很好 接下来 我在 webMethod 内添加了授权检查
  • 随机大小的网格的纹理重复

    我需要一些关于 Three js 中纹理的帮助 我有多个块 每个块都有随机的宽度 高度 我需要对它们应用相同的纹理 但沿整个块重复 正如我从另一个答案中看到的 我可以使用以下代码设置纹理重复 lavaTexture wrapS lavaTe
  • 表单提交后标题位置未重定向

    您好 我的表单在提交后没有重定向到我的成功页面 该消息确实通过了 我确实收到了测试电子邮件 但是 我的表单在发送电子邮件后不会重定向 我正在使用标头位置来重定向 谁能帮我这个 require once class phpmailer php
  • 何时使用存储过程而不是使用任何带有编程逻辑的 ORM?

    大家好 我想知道什么时候我应该更喜欢编写存储过程而不是编写编程逻辑和使用 ORM 或其他东西提取数据 存储过程在服务器端执行 这意味着处理大量数据不需要通过网络连接传递这些数据 此外 通过存储过程 您可以构建一致的复杂业务逻辑 比如说 您每
  • 以编程方式发布表单并没有执行我的浏览器正在执行的操作。为什么?

    我正在尝试以编程方式在不属于我的网站上提交表单 我正在尝试模拟使用网络浏览器手动执行的操作 我正在使用 HTTP 库发出 HTTP POST 请求 由于我不知道 当我以编程方式提交表单时 与在网络浏览器中手动提交相比 我得到了不同的结果 错
  • 将 COMP-3 压缩十进制字段解释为数值

    我正在创建一个 SSIS 包来从一系列抄写本文件中读取解压数据 我不确定以下字段定义的正确解释 希望有人知道 FIELD NAME 1 PIC S9 15 V9 3 COMP 3 FIELD NAME 2 PIC S9 3 V9 8 COM
  • 在rails中,如何确定记录是否被依赖的: :destroy 回调销毁?

    我的 Rails 应用程序中有一条记录after destroy需要知道记录被破坏的原因的钩子 更具体地说 如果该记录由于其父记录而被级联销毁dependent destroy 它需要采取与单独销毁记录不同的方式 我想做的是看看它的父母是否
  • SQL选择连接帮助

    我在找出针对此场景的查询时遇到问题 我想在这个查询中使用两个表 它们是这样的 Units ID Other Data People ID UnitID lt fk to Units Other Data 这就是我想做的 我想选择人员表中没有
  • 构建 Qt 应用程序时出现“/usr/bin/ld: 找不到 -lGL”

    我昨天安装了 Linux Debian 然后安装了最新的 Qt 版本 今天我安装了gcc和g 但问题是 当我创建 GUI 应用程序时它不会构建和运行 每当我创建一个新项目时 选择 gui 甚至不更改任何未编译的内容 我会收到以下消息 usr
  • 将静态库链接到共享对象时,__attribute__((used)) 无效(android gcc 4.8)

    我正在将一些东西移植到 Android 并且我有几个应该链接到 so 文件中的静态库 使用 Android NDK 我尝试使用 Wl whole archive到链接器 并由适当的终止 Wl no whole archive 但出现错误 例
  • 如何通过维护其他配置在现有 Eclipse 中设置 Struts 2?

    我是一个新手程序员 正在使用阿帕奇Struts 2 http struts apache org MVC 框架 我想在现有的 Eclipse IDE 中设置 Struts 2 并且不想损害我在 Eclipse 中所做的其他不同工作 以下是我
  • java中连续重复字符的替换

    我正在研究 Twitter 数据标准化 Twitter 用户经常使用 ts I looooooove it 之类的术语来强调 爱 这个词 我想通过替换重复字符来将这些重复的字符转换为正确的英语单词 直到我得到一个正确的有意义的单词 我知道我
  • Python脚本判断一个目录是否是git仓库

    我刚刚开始使用 Python 我的第一个任务是编写一个脚本来确定它运行的目录是否是 git 存储库 一位同学建议了这段代码 usr bin env python from subprocess import Popen PIPE STDOU
  • 多处理 vs 线程 Python [重复]

    这个问题在这里已经有答案了 我正在尝试了解的优点多重处理 http docs python org library multiprocessing over 线程 http docs python org library threading
  • ARM 与 x86 的主要区别是什么?

    我不太有兴趣了解在每个平台上开发代码时在程序员习惯做什么或他发现更容易做什么等方面的 小字 差异 我也对详细的物理差异不感兴趣核心 如果适合你的叙述 我不介意提及它们 我只是不想关注上面的内容 我只是想知道为什么x86等CISC架构优于RI
  • 有选择地替换字符串内的子字符串

    我有一个像这样的字符串 a java jobs in delhi delhi 我想用 代替德里 但只有位于双引号之外的 delhi 因此 输出应该如下所示 java jobs in delhi 该字符串是示例字符串 子字符串不一定是 del
  • LWJGL 光线拾取 (gluUnProject)

    因此 我一直在浏览教程 以及本网站上的问题 但没有找到任何可以解决我的问题的方法 这是我正在尝试实现的当前代码 private void pick float matModelView new float 16 matProjView ne
  • C 函数的返回值到 ASM

    我正在尝试从 ASM 中调用一个函数 我知道如何调用它 但我无法找到如何获取该函数的返回值 示例如下 C code int dummy return 5 N ASM代码 dummyFunction call dummy grab retur
  • 如何使我的应用程序链接库与其位置无关?

    我建立了一个共享库 即libabc so 和一个可执行文件 即myapp 它使用我的共享库 我已将共享库和可执行文件都放置在文件系统中 但是当我运行可执行文件时 出现以下错误 error while loading shared libra