Linux中openssl/opensslv.h找不到问题的解决方法
前言
众所周知scrapy是Python中鼎鼎大名的爬虫框架,在安装scrapy过程中碰到了openssl某个文件找不到的问题,并进行了分析,记录之。
一、 scrapy以及安装过程
Scrapy是python中鼎鼎大名的爬虫框架,笔者在Centos7系统之上进行安装,发现了如下问题:
>>pipinstallscrapy
由于安装过程中的过程信息比较多,这里只列出了其中的关键片段信息:
runningegg_info writingrequirementstosrc/cryptography.egg-info/requires.txt writingsrc/cryptography.egg-info/PKG-INFO writingtop-levelnamestosrc/cryptography.egg-info/top_level.txt writingdependency_linkstosrc/cryptography.egg-info/dependency_links.txt writingentrypointstosrc/cryptography.egg-info/entry_points.txt readingmanifestfile'src/cryptography.egg-info/SOURCES.txt' readingmanifesttemplate'MANIFEST.in' nopreviously-includeddirectoriesfoundmatching'docs/_build' warning:nopreviously-includedfilesmatching'*'foundunderdirectory'vectors' writingmanifestfile'src/cryptography.egg-info/SOURCES.txt' runningbuild_ext generatingcffimodule'build/temp.linux-x86_64-2.7/_padding.c' creatingbuild/temp.linux-x86_64-2.7 generatingcffimodule'build/temp.linux-x86_64-2.7/_constant_time.c' generatingcffimodule'build/temp.linux-x86_64-2.7/_openssl.c' building'_openssl'extension creatingbuild/temp.linux-x86_64-2.7/build creatingbuild/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7 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-cbuild/temp.linux-x86_64-2.7/_openssl.c-obuild/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/_openssl.o build/temp.linux-x86_64-2.7/_openssl.c:434:30:fatalerror:openssl/opensslv.h:Nosuchfileordirectory #include^ compilationterminated. error:command'gcc'failedwithexitstatus1 ---------------------------------------- Command"/usr/bin/python2-u-c"importsetuptools,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"failedwitherrorcode1in/tmp/pip-build-hRMlG0/cryptography/ [root@AY131203102210033c39Z~]#yuminstallopensslbuild/temp.linux-x86_64-2.7/_openssl.c:434:30:fatalerror:openssl/opensslv.h:Nosuchfileordirectory ^C Exitingonusercancel.
由于确实openssl.c文件而安装失败了,貌似没有找到对应的文件
二、问题分析
首先怀疑openssl没有安装,故先进行openssl的检查:
>>yuminfoopenssl
Loadedplugins:fastestmirror Loadingmirrorspeedsfromcachedhostfile *base:mirrors.aliyun.com *epel:mirrors.aliyun.com *extras:mirrors.aliyun.com *updates:mirrors.aliyun.com InstalledPackages Name:openssl Arch:x86_64 Epoch:1 Version:1.0.1e Release:60.el7_3.1 Size:1.5M Repo:installed Summary:UtilitiesfromthegeneralpurposecryptographylibrarywithTLSimplementation URL:http://www.openssl.org/ License:OpenSSL Description:TheOpenSSLtoolkitprovidessupportforsecurecommunicationsbetween :machines.OpenSSLincludesacertificatemanagementtoolandshared :librarieswhichprovidevariouscryptographicalgorithmsand :protocols.
基于其中的信息可以得知,openssl是一家安装过了,怎么还是会缺少openssl.c的文件呢?
经过一番思考,豁然发现一个基本规则,openssl已经安装二进制的可执行程序,而这里的安装scrapy则需要的是openssl的源文件程序,比如openssl.h。故这里需要补充安装的是openssh.h的开发版,其中包含相关的安装源代码文件。
三、问题的解决
在确认了问题之后,接下来就是安装openssl-devel的安装包了:
>>yuminstallopenssl-devel
在安装完成之后,重新安装scrapy,就可以顺利安装成功了
总结
推而广之,在Linux系统中都存在类似的问题,在安装特定安装包的过程中,其依赖某些第三方开发包,会曝出某些文件找不到的错误,一般情况下是需要安装依赖包的开发版本的。这个规则应该是通用的。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。