> CentOS > CentOS故障 >

解决centos中的 openssl/opensslv.h找不到的问题

引言: scrapy是Python中鼎鼎大名的爬虫框架,在安装scrapy过程中碰到了openssl某个文件找不到的问题,并进行了分析,记录之。

1.  scrapy以及安装过程

   Scrapy是Python中鼎鼎大名的爬虫框架,笔者在Centos 7系统之上进行安装,发现了如下问题:

   >> pip install scrapy

    由于安装过程中的过程信息比较多,这里只列出了其中的关键片段信息:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1.  running egg_info  
  2.     writing requirements to src/cryptography.egg-info/requires.txt  
  3.     writing src/cryptography.egg-info/PKG-INFO  
  4.     writing top-level names to src/cryptography.egg-info/top_level.txt  
  5.     writing dependency_links to src/cryptography.egg-info/dependency_links.txt  
  6.     writing entry points to src/cryptography.egg-info/entry_points.txt  
  7.     reading manifest file 'src/cryptography.egg-info/SOURCES.txt'  
  8.     reading manifest template 'MANIFEST.in'  
  9.     no previously-included directories found matching 'docs/_build'  
  10.     warning: no previously-included files matching '*' found under directory 'vectors'  
  11.     writing manifest file 'src/cryptography.egg-info/SOURCES.txt'  
  12.     running build_ext  
  13.     generating cffi module 'build/temp.linux-x86_64-2.7/_padding.c'  
  14.     creating build/temp.linux-x86_64-2.7  
  15.     generating cffi module 'build/temp.linux-x86_64-2.7/_constant_time.c'  
  16.     generating cffi module 'build/temp.linux-x86_64-2.7/_openssl.c'  
  17.     building '_openssl' extension  
  18.     creating build/temp.linux-x86_64-2.7/build  
  19.     creating build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7  
  20.     gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/python2.7 -c build/temp.linux-x86_64-2.7/_openssl.c -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/_openssl.o  
  21.     build/temp.linux-x86_64-2.7/_openssl.c:434:30: fatal error: openssl/opensslv.h: No such file or directory  
  22.      #include <openssl/opensslv.h>  
  23.                                   ^  
  24.     compilation terminated.  
  25.     error: command 'gcc' failed with exit status 1  
  26.       
  27.     ----------------------------------------  
  28. Command "/usr/bin/python2 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-hRMlG0/cryptography/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-ReCoWo-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-hRMlG0/cryptography/  
  29. [root@AY131203102210033c39Z ~]# yum install openssl  build/temp.linux-x86_64-2.7/_openssl.c:434:30: fatal error: openssl/opensslv.h: No such file or directory  
  30. ^C  
  31.   
  32. Exiting on user cancel.  
  由于确实openssl.c文件而安装失败了,貌似没有找到对应的文件

 

2.  问题分析

  首先怀疑openssl没有安装,故先进行openssl的检查:

  >> yum info openssl  

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. Loaded plugins: fastestmirror  
  2. Loading mirror speeds from cached hostfile  
  3.  * base: mirrors.aliyun.com  
  4.  * epel: mirrors.aliyun.com  
  5.  * extras: mirrors.aliyun.com  
  6.  * updates: mirrors.aliyun.com  
  7. Installed Packages  
  8. Name        : openssl  
  9. Arch        : x86_64  
  10. Epoch       : 1  
  11. Version     : 1.0.1e  
  12. Release     : 60.el7_3.1  
  13. Size        : 1.5 M  
  14. Repo        : installed  
  15. Summary     : Utilities from the general purpose cryptography library with TLS implementation  
  16. URL         : http://www.openssl.org/  
  17. License     : OpenSSL  
  18. Description : The OpenSSL toolkit provides support for secure communications between  
  19.             : machines. OpenSSL includes a certificate management tool and shared  
  20.             : libraries which provide various cryptographic algorithms and  
  21.             : protocols.  
 基于其中的信息可以得知,openssl是一家安装过了,怎么还是会缺少openssl.c的文件呢?

 

 经过一番思考,豁然发现一个基本规则, openssl已经安装二进制的可执行程序,而这里的安装scrapy则需要的是openssl的源文件程序,比如openssl.h。故这里需要补充安装的是openssh.h的开发版,其中包含相关的安装源代码文件。

3.  问题的解决

  在确认了问题之后,接下来就是安装openssl-devel的安装包了:

  >> yum install openssl-devel

  在安装完成之后,重新安装scrapy,就可以顺利安装成功了

4. 总结

 推而广之,在Linux系统中都存在类似的问题,在安装特定安装包的过程中,其依赖某些第三方开发包,会曝出某些文件找不到的错误,一般情况下是需要安装依赖包的开发版本的。 这个规则应该是通用的。

(责任编辑:IT)