Linux:从 /usr/local/lib 加载库时出错

问题描述 投票:0回答:2

我有一个运行 Debian Wheezy 的 ARM 嵌入式系统。我们自定义编写的应用程序的一些功能被分成共享库文件。我们将共享库文件存储在 /usr/local/lib 下。

我看到的问题是我们的一个二进制文件无法正确启动,因为它无法从 /usr/local/lib 加载共享库之一:

/usr/local/bin/daemon_watchdog:加载共享库时出错:libroots-base.so.5.3:无法打开共享对象文件:没有这样的文件或目录

文件 libroots-base.so.5.3 存在于 /usr/local/lib 中。应该在 /usr/local/lib 中搜索库,因为我们在目录 /etc/ld.so.conf.d/ 中添加了一个额外的文件来专门包含 /usr/local/lib。我还运行 ldconfig 来刷新缓存。

一个线索可能是文件 libroots-base.so.5.3 本身依赖于其他共享库。如果我在 /usr/local/lib 中运行“ldd libroots-base.so.5.3”,它会显示几个引用的库没有被选取:

    libboost_log.so.1.43.0 => not found
    libboost_thread.so.1.43.0 => not found
    libboost_system.so.1.43.0 => not found
    libPocoUtil.so.11 => not found
    libPocoFoundation.so.11 => not found
    libPocoDataSQLite.so.11 => not found
    libPocoData.so.11 => not found
    libgthread-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgthread-2.0.so.0

(0x402f1000) libdbus-glib-1.so.2 => /usr/lib/arm-linux-gnueabihf/libdbus-glib-1.so.2 (0x4005c000)

但是,列出为未找到的文件肯定存在于 /usr/local/lib 中,例如

-rw-r--r-- 1 root root 821784 Nov 22 21:29 libboost_log.so.1.43.0

此外,如果我在系统启动后手动将 LD_LIBRARY_PATH 设置为 /usr/local/lib ,我可以正常运行我们的二进制文件。

任何人都可以建议可能出了什么问题吗?

linux path arm shared-libraries
2个回答
5
投票

任何人都可以建议可能出了什么问题吗?

如果设置

LD_LIBRARY_PATH
可以解决问题,则几乎可以肯定您没有正确将
/usr/local/lib
添加到
/etc/ld.so.conf.d/

您添加到了

/etc/ld.so.conf.d/
中的哪个文件?

也许您有拼写错误,或尾随空格,或某些东西


0
投票

将库安装到 /usr/local/lib 时,我得到以下有价值的提示。我使用了 LD_RUN_PATH' 选项,效果很好。

Libraries have been installed in:
   /usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
© www.soinside.com 2019 - 2024. All rights reserved.