libcurlクロスコンパイルhttpsをサポート


概要
libcurlはプラットフォームにまたがるネットワークプロトコルライブラリであり、dict file ftp ftps gopher http https imaps pop 3 pop 3 s rtsp smb smbs smtp smtps telnet tftpなどのプロトコルをサポートしている.これは優れた安定したネットワークライブラリであり、c++がhttp開発を行う第一選択である.
ソースのダウンロード
curl公式サイトアドレス:https://curl.haxx.se/libcurl/Openssl公式サイトアドレス:https://www.openssl.org
移植する
httpインタフェースのみでアクセスできる場合はcurlを移植するだけですが、実際には多くのページがhttps方式なのでlibcurlがhttpsプロトコルをサポートする必要があります.特に注意しなければならないのは、sslサポートを開かないとhttpsインタフェースにアクセスできなくなり、エラーが返されます:CURLE_UNSUPPORTED_PROTOCOL,1:unsupported protocol移植時に開く必要があります–with-ssl、libcurl解凍ソースをダウンロードし、ソースディレクトリに入ってヘルプを表示します:./configure-h libcurl交叉编译支持https_第1张图片ここでは–with-ssl=PATHの後ろにopensslのパスが表示されます.では、移植を始めましょう.
1.Opensslの移植
このライブラリを移植する前に、ターゲットプラットフォームが32ビットシステムでプラットフォームを指定する必要がある場合、64ビットは省略する必要があります.32ビットシステムを指定しない場合、curlは使用中にssl握手に失敗する可能性が高い:curl:(35)error:2007 C 06 B:elliptic curve routines:EC_POINT_set_affine_coordinates_GFp:point is not on curve
最終的に使用する構成は次のとおりです.
setarch linux32 ./config no-asm shared --prefix=/home/xxx/work/Hi3516/bulid_libs/openssl --cross-compile-prefix=arm-himix200-linux-
  
setarch i386 ./config no-asm shared --prefix=/home/xxx/work/Hi3516/bulid_libs/openssl --cross-compile-prefix=arm-himix200-linux-

setarch i 386:生成されたのは32ビットCPUであり、64ビットCPUであればその部分を除去すると宣言する.No-asm:armフォーマットでサポートされていないため、クロスコンパイル中にアセンブリコードを使用してコンパイルプロセスを加速しません.shared:動的接続ライブラリを生成します.–prefix:make install後にディレクトリを生成するパスを指定します.
2.libcurlの移植
./configure --with-ssl=/home/xxx/work/Hi3516/mklibs/bulid_libs/openssl --prefix=/home/xxx/work/Hi3516/bulid_libs/curl --host=arm-himix200-linux CC=arm-himix200-linux-gcc CXX=arm-himix200-linux-g++

構成プロセスで予想外のエラーが発生しました:checking for HMAC_Update in -lcrypto… no checking for HMAC_Init_ex in -lcrypto… no checking for ssl_version in-laxtls...no configure:WARNING:SSL disabled,you will not be able to use HTTPS,FTPS,NTLM and more.このエラーはおかしいです.sslディレクトリの下のlibcryptoライブラリが見つからないはずです.もちろんsslとcryptoライブラリが存在することを前提にしていますが、私が指定したsslライブラリには明らかにこのライブラリがあります.構成の前にパス宣言を追加:LDFLAGS=-L/home/xxx/work/Hi 3516/mklibs/bulid_libs/openssl/libしかし人を狂わせるのは前の間違いがなくて、別の問題が現れます:configure:error:OpenSSL libs and/or directories were not found where specified!結局ライブラリファイルが見つからなかったので、理解できません.長い間、よく分析して原因を発見しました.私はopensslをコンパイルした後、ディレクトリを移動しましたが、curlコンパイルの時、検索依存はpkg-configの下の.pcファイルを通じて検索しました.私はディレクトリを移動しましたが、pcファイルは私の元のディレクトリを指しています.ok、openssl全体のディレクトリを元の道に戻して、配置しています.完璧に通過しました~!サポート構成印刷:SSL support:enabled(OpenSSL)が表示されます.
次にmake&make installがsslをサポートするcurlコンパイルを完了します.bin、libを開発ボードにコピーしてテストします.
テストの使用
curl -v https://www.baidu.com

残念なことに、libcurl交叉编译支持https_第2张图片は、ローカル証明書が設定されていないためhttpsアクセスに失敗したことが明らかです.ここでは、証明書をダウンロードしてローカルパスに置く方法が2つあります.https://curl.haxx.se/docs/sslcerts.html または証明書検証をスキップします.
curl -v -k https://www.baidu.com

アクセス成功:libcurl交叉编译支持https_第3张图片 httpsをサポートするlibcurl移植が完了しました.簡単なコードアクセステストを行い、http/getインタフェースを実現します.
int Http::http_get_api(const string &url, string &response, const char *ca_path)
{
    CURLcode res;
    CURL* curl = curl_easy_init();
    if (NULL == curl)
    {
        return CURLE_FAILED_INIT;
    }
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
    if (NULL == ca_path)
    {
        //         HOST
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    else
    {
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_easy_setopt(curl, CURLOPT_CAINFO, ca_path);
    }
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 4);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 4);//    
    
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    
    if(res)
    {
     	printf("http get response failed!");
    }
    return res;
}

簡単な説明:(1)curlを呼び出すeasy_Init()関数easy interface型ポインタ(2)呼び出しcurl_を得るeasy_setopt()転送パラメータ設定(4)呼び出しcurl_easy_perform()関数完了転送タスク(5)呼び出しcurl_easy_cleanup()メモリの解放
作者:费码程猿欢迎技术交流:QQ:2558950556转载请注明出典,如果有不当欢迎指正