一、openssl库的编译安装
- 工作目录下新建文件夹,官网下载openssl库压缩包并解压至该文件夹
1|wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
2|tar -vxf openssl-1.1.1.tar.gz
- 进入解压后文件目录即openssl-1.1.1a,执行可执行文件config
1|./config
- 编译
1|make
4. 下载安装
1|sudo make install
二、libcurl库编译安装
- 网页下载curl-7.71.1.tar.gz压缩包
通过共享文件夹将其拷贝至工作目录下新建的httpHandler文件中并解压并进入解压后文件即curl-7.71.1
1|tar -vxf curl-7.71.1.tar.gz
2|cd curl-7.71.1
- 运行configure,
--prefix=$PWD/_install
:指定编译生成的文件全部放在$PWD/_install
路径文件夹里($代表获取当前路径),而–with-ssl将之前下载安装的openssl库配置到libcurl库中,使其能够访问支持https协议的网页。
1|./configure --prefix=$PWD/_install --with-ssl
- 编译
1|make
3. 下载安装
2|sudo make install
三、编程实现人脸识别并成功获取识别网页数据结果
- post请求代码
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#define true 1
#define false 0
typedef unsigned int bool;
char buffer[20480] = {'\0'};
size_t readData( void *ptr, size_t size, size_t nmemb, void *stream)
{
strncpy(buffer, ptr, 20480);
printf("=====================================get data=========================================\n");
printf("%s\n", buffer);
}
char *getBase64FromPic(char *filePath)
{
char *bufPic;
char cmd[128] = {'\0'};
int filelen;
int fd;
sprintf(cmd, "base64 %s > tmpfile", filePath);
system(cmd);
fd = open("./tmpfile", O_RDWR);
filelen = lseek(fd, 0, SEEK_END);
bufPic = (char *)malloc(filelen+2);
lseek(fd, 0, SEEK_SET);
memset(bufPic, '\0', filelen+2);
read(fd, bufPic, filelen+2);
close(fd);
system("rm tmpfile -f");
return bufPic;
}
bool postUrl()
{
char *bufPic1;
char *bufPic2;
char *key = "8Pn4fG9m4bTrtDqf6CVbB8";
char *secret = "1a0bf505815a4f8d8d7228e10c369f9e";
int typeId = 21;
char *format = "xml";
char *postString;
bufPic1 = getBase64FromPic("./jzt1.jpg");
bufPic2 = getBase64FromPic("./jzt2.jpg");
postString = (char *)malloc(strlen(key)+strlen(secret)+strlen(bufPic1)+strlen(bufPic2)+128);
//连接postString
sprintf(postString, "&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s", bufPic1, bufPic2, key, secret, typeId, format);
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString); // 指定post内容
curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do"); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);
res = curl_easy_perform(curl);
printf("acquire success: %d\n", res);
if (strstr(buffer, "是") != NULL ){
printf("the same person\n");
}
else {
printf("different person\n");
}
curl_easy_cleanup(curl);
}
return true;
}
int main(void)
{
postUrl();
}
~
- 运行结果
网页数据:
总结:在按照上述步骤配置安装openssl库时没有出现任何报错,但是在对faceDemo1.c进行编译时运行时,即:
1|gcc faceDemo1.c -I curl-7.71.1/_install/include/ -L curl-7.71.1/_install/lib/ -lcurl
2|./a.out
运行结果并不是上图所示,只返回了"acquire success:1",ping www.baidu.com也能ping得通,代码检查了也没啥问题,所以我就一直对openssl库重复进行上述安装操作,最终也无济于事。随后我又重新开启设置了一台虚拟机,也是按照上述操作进行openssl库、libcurl库的安装,编译运行a.out时出现了报错:
“./a.out:./a.out: error while loading shared libraries: libcurl.so.4: cannot open shared
”
对此,我在网上参考了一些解决方法(也踩了一些雷),方法如下:
1|将libcurl.so.4拷贝至根目录下/usr/local/lib/(sudo cp....)
2|命令行输入su进入超级用户模式,然后再vim /etc/ld.so.conf.d/usr-libs.conf,在该文件中输入/usr/local/lib并保存退出
3|ldconfig (更新/etc/ld.so.cache文件)
4|exit (退出超级用户模式)
此时,在编译faceDemo1.c运行a.out时就能得到json数据,然后我又在我先前的虚拟机上进行该操作后,编译运行也能得出正确的结果(真的是心累,第一个虚拟机编译运行a.out
如果报错,早就可以把问题解决掉,浪费了我太多时间在配置openssl库上,真的搞心态),最后以上所有操作均可在树莓派上进行(在树莓派上编译时即:gcc faceDemo1.c -I curl-7.71.1/_install/include/ -L curl-7.71.1/_install/lib/ -lcurl
如果出现以下报错)
即:
./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_keylog_callback@OPENSSL_1_1_1'
./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_post_handshake_auth@OPENSSL_1_1_1'
./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_ciphersuites@OPENSSL_1_1_1'
此时,可在编译命令最后加上“-lssl -lcrypto
”再次编译即可生成a.out,如下图所示: