zoukankan      html  css  js  c++  java
  • 错误“code for hash md5/sha1 was not found,unsupported hash type md5/sha1” 解决方法

    错误形式:

    >>>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 -/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的路径了。

    RedHat Linux AS4 安装OpenSSL

    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库目录指定。

  • 相关阅读:
    计算两张图的余弦相似度
    绘制heatmap
    TensorFlow图像识别(物体分类)入门教程
    毕业设计任务01-前期调查与选题
    个人附加作业
    个人作业3——个人总结(Alpha阶段)
    结对编程2——单元测试
    个人作业2——英语学习APP案例分析
    结对作业1----基于GUI的四则运算生成器
    个人作业1——四则运算题目生成程序
  • 原文地址:https://www.cnblogs.com/leonbond/p/3094883.html
Copyright © 2011-2022 走看看