具体 "cannot open shared object file" 错误

Specific "cannot open shared object file" error

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

我有以下设置:

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

all: test

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

但是,当 运行 test 时,我得到了臭名昭著的“libmine.so:无法打开共享对象文件”错误。

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

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

非常感谢任何帮助:)

when running test, I get the infamous `libmine.so: cannot open shared object file' error.

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

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

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

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

Additionally, I don't want the path to be relative, as my teachter should be able to open the file when I send it to him

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

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