共享库,makefile,库路径

3

我是一名帮助翻译的助手。以下是需要翻译的与IT技术相关内容:

我正在尝试将我的程序链接到共享库。我使用Makefile进行编译,它看起来像这样:

`

make: sms_out.cpp SMSDispatch.cpp SMSDispatch.h
      g++ -c -fPIC SMSDispatch.cpp -o SMSDispatch.o
      g++ -shared SMSDispatch.o -o libSMSDispatch.so
`     g++ sms_out.cpp -L. -lSMSDispatch -o sms_out

如果我在命令行窗口中运行该程序,则可以正常工作:

LD_LIBRARY_PATH="." ./sms_out

但我希望只需键入./sms_out即可运行它,有人能帮忙吗? 尝试在makefile中添加export LD_LIBRARY_PATH=.,但这没有起作用,当我尝试运行程序时,只得到错误消息“error while loading shared libraries: libSMSDispatch.so: cannot open shared object file: No such file or directory”。

2个回答

3
另一种选项是向链接器提供-rpath选项,以告知您的二进制文件在哪里搜索动态对象。
g++ -Wl,-rpath=<path to .so> -o <your binary here> <cpp file name>.cpp

2
将包含.so文件的目录添加到LD_LIBRARY_PATH中:
$ export LD_LIBRARY_PATH=/dir/containing/sharedobject

您可能会发现有用的实用程序是ldd,它打印共享库依赖项。例如:
    $ ldd /bin/ls
        linux-vdso.so.1 =>  (0x00007fff819ff000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fc0d3f67000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc0d3d4a000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007fc0d3b42000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fc0d37e9000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc0d35cd000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc0d4170000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fc0d33c9000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007fc0d31c4000)
如果共享对象无法定位,则显示字符串not found或类似内容,而不是使用的共享对象路径。

我想告诉正在运行的程序,它正在查找的库在我的文件夹中,也就是“.”。使用LD_LIBRARY_PATH="." ./sms_out或在运行程序之前使用export LD_LIBRARY_PATH=.可以正常工作。但是,如果我尝试将export LD_LIBRARY_PATH=.添加到Makefile中,在调用Makefile后运行程序时它却不能工作。你知道为什么吗? - Veronic
在运行makefile后,请检查LD_LIBRARY_PATH的值:您不能像那样“导出”变量,该“导出”仅会影响运行脚本的进程。我不知道如何从makefile中修改环境变量(这并不是说不存在机制,只是我不知道)。如果您有一个包含“export”语句的脚本,可以通过像这样调用它来更改环境:$ . ./myexport.sh - hmjd
好的,但是我可以把导出语句放到我想要运行的文件(sms_out.cpp)中吗?顺便说一下,在我运行makefile之后,LD_LIBRARY_PATH的值为空,而且我认为在运行之前它也是空的。 - Veronic
不,必须在执行sms_out之前设置库路径。您不喜欢从命令行设置LD_LIBRARY_PATH的原因是什么? - hmjd
不,只是觉得这样会更好看,更容易。谢谢。 - Veronic
你可以生成一个静态库.a,而不是共享库,并将其静态链接到二进制文件中,避免修改LD_LIBRARY_PATH。我知道这个问题是关于共享对象的,但只是想提一下。 - hmjd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接