Makefile 具体的;无法打开共享对象文件";错误

Makefile 具体的;无法打开共享对象文件";错误,makefile,export,shared-libraries,shared-objects,Makefile,Export,Shared Libraries,Shared Objects,我是一名计算机科学一年级的学生,修了一门关于制作文件的课程。在我们的第一个任务中,我们必须创建一个共享库并与之链接 我有以下设置: 包含文件夹app和lib的文件夹hw1 在lib中有一个名为libmine的文件。因此,我要链接的库 在app中,有两个文件:test.cpp和一个Makefile。前者使用libmine库 Makefile如下所示(在文件本身中,缩进等是正确的): 但是,在运行测试时,我遇到了臭名昭著的“libmine.so:无法打开共享对象文件”错误 我相信这与导出LD\u

我是一名计算机科学一年级的学生,修了一门关于制作文件的课程。在我们的第一个任务中,我们必须创建一个共享库并与之链接

我有以下设置:

  • 包含文件夹
    app
    lib
    的文件夹
    hw1
  • lib
    中有一个名为
    libmine的文件。因此
    ,我要链接的库
  • app
    中,有两个文件:
    test.cpp
    和一个
    Makefile
    。前者使用
    libmine
Makefile
如下所示(在文件本身中,缩进等是正确的):

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

我相信这与导出
LD\u LIBRARY\u PATH
有关。我已经尝试过这样做(
export LD\u LIBRARY\u PATH=$[库文件夹的很长相对路径]
),但我想在我的
Makefile
中这样做。此外,我不希望路径是相对的,因为当我将文件发送给我的教师时,他应该能够打开该文件(因此我认为它应该类似于
。/lib/libmine.so

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

非常感谢您的帮助:)

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

发生这种情况是因为
-L../lib
参数告诉静态链接器在哪里找到库,但它没有告诉动态链接器(也称为加载程序),问题是后者找不到库

要解决此问题,可以使用
LD\u LIBRARY\u PATH
,但这通常是不明智的

您需要的是名为
RPATH
RUNPATH
的东西(假设您在Linux或类似系统上):

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

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

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

需要明确的是,这不是完整的错误消息,当您尝试执行
test
时会出现错误消息,而不是当您执行Make and build
test
时。对吗?您是否通过不同的方式运行了
test
,例如在当前目录中使用
libmine.so
?是的,这是正确的。问题是在运行时找不到库。先生,你是我的英雄。现在一切都好了。唯一的问题是我写了
-Wl,-rpath='../lib'
,所以没有
$ORIGIN
(因为这不起作用)。谢谢。
tar cvf to-send.tar app/test lib/libmine.so
g++ -Wall -o test -L../lib -I../lib/include test.cpp -Wl,-rpath='$ORIGIN/../lib' -lmine