错误形式:
>>>inport hashlib
ERROR:root:code for hash md5 was not found.
…
ValueError:unsupported hash type md5
…
ERROR:root:code for hash sha1 was not found.
…
ValueError:unsupported hash type sha1
…
错误分析:
使用命令
>>>dir(hashlib)
['__all__', '__builtins__', '__doc__', '__file__', '__get_builtin_constructor', '__name__', '__package__' , 'algorithms', 'new', 'sha224', 'sha256', 'sha384', 'sha512']
会发现里面列出的和正常的相比缺少了
'_hashlib','md5', 'sha1'
使用命令
>>>import _hashlib
ImportError: libssl.so.4: cannot open shared object file: No such file or directory
从hashlib.py的源码看出,对于hashlib提供的('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')等算法,hashlib的做法是先去检验python内置的_hashlib是否支持openssh.
检查系统是否安装了openssl
$ openssl version
OpenSSL 1.0.0e 6 Sep 2011
已安装,但是python编译时没发现,通过使用ldd查看动态库依赖关系
$ export LD_TRACE_LOADED_OBJECTS=1
$ldd _hashlib.so
$ unset LD_TRACE_LOADED_OBJECTS
确实没有看到有libssl.so.4。
去/usr/lib和/lib下找发现有libssl.so.0.9.8,应该是这个版本的问题了,程序需要的是libssl.so.4. 所以是libssl.so.4动态库找不到的原因导致hashlib模块认为使用cx_freeze编译后的python环境不具备openssl支持,进而使用第三方md5等算法,但此时运行环境中第三方md5等模块也不具备,所以程序运行时出错,
解决方案:
为解决这一问题可以手动修改lib库的软连接,
ln –s /usr/lib/libssl.so.0.9.8 /lib/libssl.so.4
接下来会发现找不到共享库文件libcrypto.so.4,同样,使用命令
ln –s /usr/lib/libcrypto.so.0.9.8 /lib/libcrypto.so.4
即可。
缺少动态连接库.so--cannot open shared object file: No such file or directory
这种错误总结下来主要有3种方法:
1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
ln-s/where/you/install/lib/*.so /usr/lib
sudo ldconfig
2.修改LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH
sudo ldconfig
3.修改/etc/ld.so.conf,然后刷新
vim/etc/ld.so.conf
add/where/you/install/lib
sudo ldconfig
拓展阅读
dconfig是一个动态链接库管理命令
为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig
ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。例如:ln –s /bin/less /usr/local/bin/less
-s 是代号(symbolic)的意思。
这里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又 软链接和硬链接两种,软链接就是ln –s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls –l命令去察看,就可以看到显示的link的路径了。
linux库
库的目的是代码重用,提供共用的功能,某个程序为别的程序提供公开的接口等。
命名和编号:
(1) 所有库名以lib开头,gcc在-l指定的文件名前自动插入lib,如libmysqlclient就用-lmysqlclient
(2) .a是静态库(archive),如 libmysqlclient.a
(3) .so是共享库(shared object),如libmysqlclient.so
(4) 编号格式:library_name.major_num.minor_num.patch_num,如libmysqlclient.so.15.0.0
(5) _g和_p: /usr/lib/libform_g.a 中的_g表示这是libform.a的调试库,用locate _g.a会发现很多类似的库,但我用locate _g.so没有发现FC4有此类库;libxxx_p.a中的_p表示这是libxxx.a的性能分析库(profiling),但我用locate _p.a和locate _p.so没有发现FC4有此类路库。
库要和接口头文件配合使用,常见的库如:
libc.so (不需头文件) 标准C库
libdl.so (dlfcn.h) 让程序在运行是加载和使用库代码,而不在编译时链接库
libglib.so (glib.h) Glib工具函数,例如hash, string等
libgthread.so (glib.h) 对Glib的线程支持
libm.so (math.h) 标准C数学库
libpthread.so (pthread.h) POSIX标准Linux线程库
libz.so (zlib.h) 通用压缩程序库
库操作命令:(1) nm 列出目标文件或二进制文件的所有符号
(2) ar 创建静态库和符号索引
(3) ldd 列出程序正常运行所需要的共享库,例如
# ldd test_mysql
linux-gate.so.1 => (0x00c59000)
libmysqlclient.so.15 => /lib/libmysqlclient.so.15 (0x009a1000)
libc.so.6 => /lib/libc.so.6 (0x0038b000)
libpthread.so.0 => /lib/libpthread.so.0 (0x004f8000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x002f0000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00320000)
libm.so.6 => /lib/libm.so.6 (0x004bd000)
/lib/ld-linux.so.2 (0x0036d000)
(4) ldconfig 和动态链接和装载工具ld.so/ld-linux.so一起决定位于/usr/lib和/lib下的so库所需的链接。ldconfig创建一个从实际库到so库名的符号链接。注意/etc/ld.so.cache, /etc/ld.so.conf ldconfig -p列出/etc/ld.so.cache内的库对照链接。
环境变量:动态链接器ld.so/ld-linux.so使用一些环境变量:
$LDLIBRARY_PATH : 格式类似$PATH,:分隔,非标准位置/usr/lib和/lib下的库或者/etc/ld.so.cache中没有的库,需要加入该变量才能被搜索到。
$LD_PRELOAD: 空格分隔,定义需要在最前面加载的库。也可以由/etc/ld.so.preload文件代替
静态库和共享库都是包含object文件的文件。
建立和使用静态库:
(1) 把代码编译成目标文件,如gcc -c libxxx.c -o libxxx.o
(2) ar: ar -rcs linxxx.a linxxx.o
(3) gcc -static: gcc test.c -o test -static -L. -lxxx
(4) 用file检查静态链接的可执行文件
(5) 用nm检查符号,静态链接没有未定义符号
共享库占用系统资源少(磁盘和内存),运行时根据共享链接从单个文件加载,速度快,维护方便。在运行时,ld.so/ld-linux.so把二进制文件中的符号名链接到适当的so库上。
建立和使用共享库:
(1) gcc -fPIC 产生与位置无关的代码,如gcc -fPIC -g -c libxxx.c -o libxxx.o
(2) gcc -shared和-soname,如gcc -g -shared -Wl,–soname, -libxxx.so -o libxxx.so.1.0.0 libxxx.o (注意-Wl,–soname, -libxxx.so 中间没有空格)
(3) gcc -Wl 把参数传递给链接器ld
(4) gcc -l显式链接C库
编译时指定非标准位置/usr/lib和/lib下的库的方式是用-L库目录指定。