gpt4 book ai didi

linux - 使用共享库的问题

转载 作者:太空狗 更新时间:2023-10-29 11:33:35 25 4
gpt4 key购买 nike

我正在遵循 this page 中的解释和 this page尝试在 Ubuntu Linux 上构建和使用共享库。

我在我的 PC 上使用交叉编译器构建库和应用程序,而不是将文件复制到目标系统并在那里运行。

最后,我正处于正确定义所有符号链接(symbolic link)并且我能够运行应用程序的阶段 - 但不是以所需的形式。

假设我在目录/home/ysap/libs 中有一个共享库libtest.so.1.0。然后,我在同一目录中创建了符号链接(symbolic link) libtest.so.1libtest.so,它们都指向库文件。

在目录 /home/ysap/apps 中,我有一个使用 test 库的应用程序 app.e

现在,要运行应用程序,我可以输入:

> LD_LIBRARY_PATH=/home/ysap/libs ./app.e

应用程序运行良好。但是,我想消除分配,所以我尝试输入:

> export LD_LIBRARY_PATH=/home/ysap/libs
> ./app.e

但不幸的是我收到一条错误消息,说:

./app.e:加载共享库时出错:libtest.so.1:无法打开共享对象文件:没有这样的文件或目录

我也试过打字:

> ldconfig -n /home/ysap/libs

> sudo ldconfig -n /home/ysap/libs

但这并没有帮助。

我做错了什么?如何让 app.e 在没有变量赋值的情况下运行?


更新 1:

应用程序使用 mmap() 调用,因此必须以 sudo 权限运行。实际的调用行是:

> sudo LD_LIBRARY_PATH=/home/ysap/libs ./app.e

是否有可能 export-ed 变量未在 sudo 环境中更新?


更新 2:

ldd ./app.e 的输出:

libtest.so.1 => /home/ysap/libs/libtest.so.1 (0xb6faa000)
libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0xb6f85000)
libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6ea4000)
/lib/ld-linux.so.3 (0xb6fb7000)

最佳答案

sudo 问题如@duskwuff 所述,但是如果你想编译一个应用程序,而不需要修改 LD_LIBRARY_PATH 变量,那么在链接应用程序时你可以使用 $ORIGIN 变量,它被最新版本的 linux 识别。

如果所有库都在当前目录中,那么当您链接应用程序时,您可以使用额外的选项:

-Wl,-R'$ORIGIN'

编译时需要给选项加引号,防止被shell扩展。

如果您将其放入 Makefile 中,那么您可以使用:

-Wl,-R\$$ORIGIN

$$ 是为了让 make 使用 $,\ 是为了防止从命令行调用的 shell 在将变量传递给命令。

您可以使用任何符号路径引用,因此如果您的结构中二进制文件位于 bin/ 中,库位于 lib/ 中,则可以使用 $ORIGIN/../lib.

这也适用于 dlopen,因此它会在运行时动态加载库时找到它们

关于linux - 使用共享库的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com