gpt4 book ai didi

c++ - 运行程序时找不到共享对象库,但在编译过程中已链接

转载 作者:IT王子 更新时间:2023-10-29 01:07:28 24 4
gpt4 key购买 nike

更新:问题已解决。该库是为 Armv7a CPU 制作的,但它是“软 float ”而不是“硬 float ”。看来我的机器是 HF 而不是 SF 兼容

我的程序依赖于一个名为 libMyLib.so 的外部构建的 .so 库。当我这样编译程序时:

$ g++ -std=c++11 main.cpp -o run -pthread

它报告有很多 undefined reference ,显然是因为我在编译时没有包含 libMyLib.so。所以编译器知道他需要什么来编译程序。当我这样编译程序时:

$ g++ -std=c++11 main.cpp -o run -pthread -lMyLib

它不报告任何错误并创建文件“运行”。请注意,libMyLib.so 已经在/usr/local/lib 中,并且看起来它在编译时已链接,因为现在定义了引用并创建了“运行”文件。但是当我运行文件时,会发生这种情况:

$ ./run
./run: error while loading shared libraries: libMyLib.so: cannot open shared object file: No such file or directory

我已经与 ldd 核对过,它向我显示了这个:

$ ldd run
...
libMyLib.so => not found
...

所以 ldd 在执行时找不到库,但它在编译时找到了。我对 Linux 和链接库还很陌生,所以我不知道该怎么做。

此外,在 .so 文件上运行 ldd 会返回:

$ ldd /usr/local/lib/libMyLib.so
not a dynamic executable

我已经检查过在错误的平台上运行 .so 文件时可能会出现此消息。但我已经检查过,该库是为 arm 编译的(我在 raspberry pi -> arm 上运行):

$  objdump -f /usr/local/lib/libMyLib.so | grep ^architecture
architecture: arm, flags 0x00000150:

我还更新了链接器:

$ sudo ldconfig -v
...
/usr/local/lib:
libwiringPi.so -> libwiringPi.so.2.44
libwiringPiDev.so -> libwiringPiDev.so.2.44
libMyLib.so -> libMyLib.so.1
...

我真的不知道为什么还会发生这种情况。谁能帮帮我?

最佳答案

/usr/local/lib 是链接器默认搜索的目录之一对于使用 -l 选项指定的库,因此您的链接成功。

但是在运行时,程序加载器默认搜索链接图书馆在:-

  • /lib/usr/lib 以及名称和位置已缓存在 ldconfig 缓存中的库中,/etc/ld.so.cache.
  • 环境变量 LD_LIBRARY_PATH 值中列出的目录,在当前 shell 中。

ldconfig 缓存仅在 ldconfig 运行时更新。参见 man ldconfig .

加载器无法在运行时找到 libMyLib.so,因为您还没有运行 ldconfig 因为你将该库放在 /usr/local/lib 中并且您也没有将 /usr/local/lib 正确添加到 LD_LIBRARY_PATH在您尝试运行程序的同一个 shell 中。

需要一个特殊的设置是不方便的LD_LIBRARY_PATH 使程序能够运行。

要使加载程序能够找到您的库,请以 root 身份运行 ldconfig。这个如果 /usr/local/lib 列在 /etc/ld.so.conf 中,将会成功,或者在 /etc/ld.so.conf 包含的文件之一中。如果不是,那么您可以通过运行显式缓存 /usr/local/lib 中的共享库ldconfig/usr/local/lib,作为 root。

关于c++ - 运行程序时找不到共享对象库,但在编译过程中已链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45419253/

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