【问题标题】:Specific "cannot open shared object file" error特定的“无法打开共享对象文件”错误
【发布时间】:2016-02-12 15:32:55
【问题描述】:

我是计算机科学专业的一年级学生,正在学习(以及其他)Makefile 课程。对于我们的第一个任务,我们必须创建一个共享库并针对它进行链接。

我有以下设置:

  • 一个文件夹 hw1 包含文件夹 applib
  • lib 内部是一个名为libmine.so 的文件,这是我要链接的库。
  • app 内部,有两个文件:test.cpp 和一个Makefile。前者使用libmine 库。

Makefile 如下(在文件本身,缩进等。正确的):

all: test

test: test.cpp
      g++ -Wall -o test -L../lib -I../lib/include test.cpp -lmine

但是,当 运行 test 时,我得到了臭名昭著的 `libmine.so: cannot open shared object file' 错误。

我相信这与导出 LD_LIBRARY_PATH 有关。我试过这样做 (export LD_LIBRARY_PATH=$[very long relative path to the lib folder]),但我想在我的 Makefile 中这样做。另外,我不希望路径是相对的,因为当我将文件发送给他时,我的老师应该能够打开文件(所以我认为它应该类似于../lib/libmine.so)。

我查看了各种 StackOverflow 帖子,例如 this one,但似乎没有人回答这个特定问题(要么是设置不同,要么解决方案根本不起作用)。顺便说一句:将export LD_LIBRARY_PATH=../lib 行放在test: test.cpp 正下方和g++ 命令之前没有做任何事情。

非常感谢任何帮助:)

【问题讨论】:

  • 只是要清楚,这不是完整的错误消息,当你尝试执行test时会出现错误消息,而不是在你执行Make和build时出现@ 987654342@。那是对的吗?你有没有让test 以不同的方式运行,例如通过在当前目录中添加libmine.so
  • 是的,没错。问题是在 runtime 时找不到该库。

标签: makefile export shared-libraries shared-objects


【解决方案1】:

运行测试时,我收到臭名昭著的“libmine.so: 无法打开共享对象文件”错误。

这是因为 -L../lib 参数告诉 static 链接器在哪里可以找到库,但它没有告诉 dynamic 链接器(又名加载器),问题是后者找不到这个库。

要解决这个问题,您可以使用LD_LIBRARY_PATH,但这通常是不明智的。

您想要的是名为 RPATHRUNPATH 的东西(假设您使用的是 Linux 或类似系统):

 g++ -Wall -o test -L../lib -I../lib/include test.cpp -Wl,-rpath=../lib -lmine

另外,我不希望路径是相对的,因为当我将文件发送给他时,我的老师应该能够打开文件

你的老师会在相同系统上运行你的二进制文件,还是在不同的系统上运行?如果是前者,你可以这样做:

g++ -Wall -o test -L../lib -I../lib/include test.cpp -Wl,-rpath=/full/path/to/hw1/lib -lmine

如果是后者,/full/path/to/hw1/lib 可能会或可能不会在您老师的机器上可用,您需要考虑到底要发送给他什么。

解决这个问题的常用方法是将应用程序和库打包到一个 tar 文件中:

tar cvf to-send.tar app/test lib/libmine.so

然后老师可以将你的 tar 文件的部分解压到任意目录,并尝试运行它。要完成这项工作,您需要与应用程序相关的RPATH,无论应用程序在哪里结束。为此,您需要:

g++ -Wall -o test -L../lib -I../lib/include test.cpp -Wl,-rpath='$ORIGIN/../lib' -lmine

【讨论】:

  • 您,先生,是我的英雄。现在一切正常。唯一的事情是我写了-Wl,-rpath='../lib',所以没有$ORIGIN(因为那不起作用)。非常感谢。
猜你喜欢
  • 2019-01-30
  • 1970-01-01
  • 2011-12-23
  • 2015-10-30
  • 1970-01-01
  • 2013-04-21
  • 2013-05-05
  • 2017-05-21
  • 2012-05-24
相关资源
最近更新 更多