库只会加载 LD_PRELOAD
Library will only load with LD_PRELOAD
OS: Ubuntu 16.04 64 位
Python: 2.7.12
我有一个非常简单的 Python 程序,它只加载两个库 libhidapi-hidraw
和 libpcProxAPI
。后者依赖于前者。
from ctypes import *
hidapi = CDLL('/home/wsharp/Source/pyprox/libhidapi-hidraw.so')
pcProxAPI = CDLL('/home/wsharp/Source/pyprox/libpcProxAPI.so')
r = pcProxAPI.usbConnect()
如果我 运行 >python myfile.py
我收到以下错误:"undefined symbol: hid_send_feature_report"
但是如果我 运行 >LD_PRELOAD=./libhidapi-hidraw.so python myfile.py
我没有收到任何问题。
我试过将 libhidapi-hidraw.so
放在 /usr/lib
和 ldconfig
来源的其他路径中,但没有成功。我不确定我做错了什么,但这让我发疯。任何帮助将不胜感激。
编辑
包括sudo ldconfig -v 2>/dev/null | grep -v ^$'\t'
的输出
sudo ldconfig -v 2>/dev/null | grep -v ^$'\t'
/usr/lib/x86_64-linux-gnu/libfakeroot:
/lib/i386-linux-gnu:
/usr/lib/i386-linux-gnu:
/usr/local/lib:
/lib/x86_64-linux-gnu:
/usr/lib/x86_64-linux-gnu:
/usr/lib/x86_64-linux-gnu/mesa-egl:
/usr/lib/x86_64-linux-gnu/mesa:
/lib:
/usr/lib:
编辑 2
ldd libpcProxAPI.so
linux-vdso.so.1 => (0x00007fff9d3b9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f276c231000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f276bf28000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f276bd11000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f276b948000)
/lib64/ld-linux-x86-64.so.2 (0x000055dfcf780000)
确认您是否将文件放置在链接器搜索的路径之一中:
ldconfig -v 2>/dev/null | grep -v ^$'\t'
如果不是,你有几个选择:
- 将 LD_LIBRARY_PATH 设置为包含 .so 文件的目录
- 将目录添加到 /etc/ld.so.conf 和 运行 ldconfig -(需要 root)
OS: Ubuntu 16.04 64 位
Python: 2.7.12
我有一个非常简单的 Python 程序,它只加载两个库 libhidapi-hidraw
和 libpcProxAPI
。后者依赖于前者。
from ctypes import *
hidapi = CDLL('/home/wsharp/Source/pyprox/libhidapi-hidraw.so')
pcProxAPI = CDLL('/home/wsharp/Source/pyprox/libpcProxAPI.so')
r = pcProxAPI.usbConnect()
如果我 运行 >python myfile.py
我收到以下错误:"undefined symbol: hid_send_feature_report"
但是如果我 运行 >LD_PRELOAD=./libhidapi-hidraw.so python myfile.py
我没有收到任何问题。
我试过将 libhidapi-hidraw.so
放在 /usr/lib
和 ldconfig
来源的其他路径中,但没有成功。我不确定我做错了什么,但这让我发疯。任何帮助将不胜感激。
编辑
包括sudo ldconfig -v 2>/dev/null | grep -v ^$'\t'
sudo ldconfig -v 2>/dev/null | grep -v ^$'\t'
/usr/lib/x86_64-linux-gnu/libfakeroot:
/lib/i386-linux-gnu:
/usr/lib/i386-linux-gnu:
/usr/local/lib:
/lib/x86_64-linux-gnu:
/usr/lib/x86_64-linux-gnu:
/usr/lib/x86_64-linux-gnu/mesa-egl:
/usr/lib/x86_64-linux-gnu/mesa:
/lib:
/usr/lib:
编辑 2
ldd libpcProxAPI.so
linux-vdso.so.1 => (0x00007fff9d3b9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f276c231000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f276bf28000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f276bd11000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f276b948000)
/lib64/ld-linux-x86-64.so.2 (0x000055dfcf780000)
确认您是否将文件放置在链接器搜索的路径之一中:
ldconfig -v 2>/dev/null | grep -v ^$'\t'
如果不是,你有几个选择:
- 将 LD_LIBRARY_PATH 设置为包含 .so 文件的目录
- 将目录添加到 /etc/ld.so.conf 和 运行 ldconfig -(需要 root)