如题,本来以为很简单的一件事,然而却费了我半天的功夫。openssl确实是个好东西。 而且好像Ubuntu里面本来就有,那我为什么还要装呢?
原来是出现啦一个问题。我在运行一段程序的时候,出现了一个bug。
代码如下:
#include <openssl/sha.h"
#include <string.h>
#include <stdio.h>
int main()
{
SHA_CTX stx;
unsigned char outmd[20];//注意这里的字符个数为20
char buffer[1024];
char filename[32];
int len=0;
int i;
FILE * fp=NULL;
memset(outmd,0,sizeof(outmd));
memset(filename,0,sizeof(filename));
memset(buffer,0,sizeof(buffer));
printf("请输入文件名,用于计算SHA1值:");
scanf("%s",filename);
fp=fopen(filename,"rb");
if(fp==NULL)
{
printf("Can't open file\n");
return 0;
}
SHA1_Init(&stx);
while((len=fread(buffer,1,1024,fp))>0)
{
SHA1_Update(&stx,buffer,len);
memset(buffer,0,sizeof(buffer));
}
SHA1_Final(outmd,&stx);
for(i=0;i<20;i<i++)
{
printf("%02X",outmd[i]);
}
printf("\n");
return 0;
}
问题如下:
undefined reference to SHA1!!!! 可我明明已经装过了openssl,怎么可能会undefined???
于是,我就在网上查。一个帖子引起了我的注意: Linux 坑爹的undefined to SHA
帖子说,不要用-lssl。要用-lcrypto。为什么?帖子并没有说太清楚。
兴致勃勃的赶紧试过,然并卵。崩溃的我又想寻求其他解释,然而,都无所进展。可能是openssl的问题吧,于是我无奈地选择了重新安装openssl这条不归路。
安装的过程,如同人生一样,充满着痛苦与折磨。一开始,我单纯的以为,这只要简单的apt-get就行啦。
于是乎, 敲上两行代码:
sudo apt-get install openssl
sudo apt-get install libssl-dev
然而发现,并没有什么变化。于是乎,我采用啦另外一种方法,安装源码。
从openssl官网上download一个1.0.2的版本,解压安装。。。
等了几分钟,装完啦。我又兴致勃勃的试,依旧无果。折腾半天才发现,原来本应在/usr/local应该有个ssl文件。这是openssl安装的目标文件。然而并没有。。。再仔细一看,最后,make install时,出现啦error。。。
Makefile:284: recipe for target ‘build_crypto’ failed
这下,我深陷于绝望的泥沼,然而将死而非死。网上一堆又一堆的说法,然而我感觉没有一种适合我的。我决定冷静一下。
然后想,或许这个安装包有问题?于是我又下啦个1.0.1的版本。顺便一瞥,下载链接的下面有个提示,建议在安装前先看readme文件。于是乎,与直接按网上的安装方法按部就班不同,这次我选择直接看readme文件。里面有很多废话,重要的就是安装前要看INSTALL文件(For Linux or Unix)。里面的安装过程很简单,但却很有效。方法如下:
$ ./config
$ make
$ make test
$ make install
然后, /usr/local/下终于出现啦期待的ssl文件夹。兴奋之情,溢于言表。
我再去编译,却提示没有这个头文件。原来,我之前把老的include里面的openssl文件删啦,新装的都是在/usr/local/ssl下,系统路径无法直接识别。这个好解决。参照如何升级ubuntu的openssl库,利用软链接将/usr/local/ssl链接上去。
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig -v
到此基本完成,然而还要注意的是,编译时,参数为-lcrypto,不是-lssl。
终于,大功告成!!!虽然,过程很痛苦,但最终的结果还是可以接受的。当然,同样也存在一些问题,比如-lcrypto和-lssl有什么区别?下一步就可以学习这个。