我试图通过在目录中提供Qt库作为共享库并使用LD_LIBRARY_PATH将ld指向它们来部署Qt应用程序。这适用于所有Qt库,例如libQt5Network或libQt5Gui,但不适用于以某种方式找不到的libQt5Core,而是使用系统版本。
使用LD_DEBUG =所有我可以看到ld尝试存在的文件,但跳过它
3705: file=libQt5Core.so.5 [0]; needed by ./app.bin [0]
3705: find library=libQt5Core.so.5 [0]; searching
3705: search path=/home/user/app/lib:/usr/lib64/tls/x86_64/x86_64:/usr/lib64/tls/x86_64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64/x86_64:/usr/lib64/x86_64:/usr/lib64/x86_64:/usr/lib64 (LD_LIBRARY_PATH)
3705: trying file=/home/user/app/lib/libQt5Core.so.5 <- this file exists
3705: trying file=/usr/lib64/tls/x86_64/x86_64/libQt5Core.so.5
3705: trying file=/usr/lib64/tls/x86_64/libQt5Core.so.5
3705: trying file=/usr/lib64/tls/x86_64/libQt5Core.so.5
3705: trying file=/usr/lib64/tls/libQt5Core.so.5
3705: trying file=/usr/lib64/x86_64/x86_64/libQt5Core.so.5
3705: trying file=/usr/lib64/x86_64/libQt5Core.so.5
3705: trying file=/usr/lib64/x86_64/libQt5Core.so.5
3705: trying file=/usr/lib64/libQt5Core.so.5
libQt5Core.so.5和app.bin都是64位精灵。
有没有办法找出ld拒绝文件的原因?
答案 0 :(得分:1)
解决方案在这里:https://github.com/Microsoft/WSL/issues/3023
该库包含一个ABI注释,可以使用strip删除它以使ld接受该库。
答案 1 :(得分:0)
other answer是正确的。以防万一那里的链接断开了,这是我的情况以及修复方法。
我在安装Qt5的系统上运行版本3.10的旧内核。其中一个库– libQt5Core.so.5.11.0
具有ELF节.note.ABI-tag
,该节指定该库是针对内核3.17.0编译的。可以通过例如
objdump -sj .note.ABI-tag /path/to/library.so
file
揭示了它是为较新的内核编译的事实,在输出末尾附近很难注意到“ for GNU / Linux 3.17.0”。就我而言,是:
/opt/qt511/lib/libQt5Core.so.5.11.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.17.0, BuildID[sha1]=df5f7e933899d1ff629145ab7ca35b2f9bc41843, stripped
所以我的解决方法是运行
strip --remove-section=.note.ABI-tag /path/to/library.so
删除了此部分并允许加载库。
但是请注意,如果执行此操作,则会明确破坏库构建系统可能使用的假设,因此可能会破坏。就我而言,他们没有。