C++ Mac libcurl を使ってみた
こんにちは、Yuuichi(@WestHillWorker)です。
今回は、久しぶりにC++での開発が増えてきそうなので、自分があまり触ってこなかったcurlライブラリについて使い方をまとめてみました。
学習ということもあり、今回も自分のMac環境で全て動作するようにしています。
参考libcurl公式サイト
スポンサーリンク
curlインストール
デフォルトではMacにインストールされていないため、brewでcurlをインストール。
// curl インストール $ brew install curl ・・・・ ・・・ For compilers to find this software you may need to set: ↓ライブラリ・インクルードファイル置き場 LDFLAGS: -L/usr/local/opt/curl/lib CPPFLAGS: -I/usr/local/opt/curl/include For pkg-config to find this software you may need to set: PKG_CONFIG_PATH: /usr/local/opt/curl/lib/pkgconfig ==> Summary ? /usr/local/Cellar/curl/7.59.0: 421 files, 3MB // curl バージョン確認 $ curl-config --version libcurl 7.59.0
インストール完了!!
公式サイトからもダウンロードできます。
コンパイル方法
自身が作成予定のcppファイルの後に「-lcurl」を付与して、コンパイルする。
// libcurl test コード取得 $ curl -O https://raw.githubusercontent.com/yuugure/cpp_study/master/libcurl/libCurlTest.cpp // C++ としてコンパイル $ g++ libCurlTest.cpp -lcurl -o libCurlTest // 実行(サンプルでスタバのHPを取得するようになっている) $ ./libCurlTest ・・・・・・ ・・・ </ul> <p class="pageTop js-pageTop"> </p> <p class="copyright"><small>©2018 Starbucks Coffee Company. All Rights Reserved.</small></p> <!-- /.globalFooterIn --></div> <!-- /.global --></footer><!-- /.wrapper --></div> </body> </html> // g++ <ファイル名>.cpp -lcurl -o <コンパイルしたファイル名> // コンパイル時のリンカオプションの確認 $ curl-config --libs -L/usr/local/Cellar/curl/7.59.0/lib -lcurl -lldap -lz →curlを利用するので「-lcurl」
テストコード
スターバックスHPにリクエストした結果を出力しています。
リクエストのエラーハンドリングとか細かいことはやってないため、必要最低限。
#include <iostream> #include <string> #include <curl/curl.h> static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } int main(void) { CURL *curl; // ハンドラの初期化(セッション開始) curl = curl_easy_init(); if(curl) { CURLcode res; std::string readBuffer; // curl 実行オプション設定 (実際まだリクエストしていない状態) // 参考:https://curl.haxx.se/libcurl/c/curl_easy_setopt.html curl_easy_setopt(curl, CURLOPT_URL, "http://www.starbucks.co.jp/"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); // 設定したオプションでリクエスト res = curl_easy_perform(curl); // セッション終了 curl_easy_cleanup(curl); std::cout << readBuffer << std::endl; } return 0; }
公式の方にコード別の情報がありました。
参考エラーコード系
ライブラリについて
brew経由でインストールする際にメッセージにて、curl関連ファイルのパスが出力されます。
// ライブラリ・インクルードファイル置き場 LDFLAGS: -L/usr/local/opt/curl/lib CPPFLAGS: -I/usr/local/opt/curl/include // libcurlを使う際のincludeファイル // こんなファイル群を使うんだなと把握 $ ls -la /usr/local/opt/curl/include/curl -rw-r--r-- 1 root admin 103121 3 14 15:45 curl.h -rw-r--r-- 1 root admin 3034 3 14 15:45 curlver.h -rw-r--r-- 1 root admin 3473 3 14 15:45 easy.h -rw-r--r-- 1 root admin 2071 3 14 15:45 mprintf.h -rw-r--r-- 1 root admin 16211 3 14 15:45 multi.h -rw-r--r-- 1 root admin 1329 3 14 15:45 stdcheaders.h -rw-r--r-- 1 root admin 17684 3 14 15:45 system.h -rw-r--r-- 1 root admin 43215 3 14 15:45 typecheck-gcc.h
curl 7.7.2からcurl-configツールが使えるようになったようです。
ソースコードを使用してlibcurlをコンパイルする方法など知りたい情報を取得できるので良さそうでした。
# コンパイラフラグの確認 $ curl-config --cflags -I/usr/local/Cellar/curl/7.59.0/include # コンパイル時のリンカオプションの確認 $ curl-config --libs -L/usr/local/Cellar/curl/7.59.0/lib -lcurl -lldap -lz # libcurlがSSLを可能な状態で構築されているか確認 $ curl-config --feature | grep SSL SSL # libcurlバージョン確認 $ curl-config --version libcurl 7.59.0
VSC用設定
Visual Studio Code 使っている方は、以下でコンパイル実行可能です。
"code-runner.executorMap": { // libcurl setting "cpp": "cd $dir && runFiles=`ls *.cpp` && g++ `echo ${runFiles}` -lcurl -o $fileNameWithoutExt && $dir$fileNameWithoutExt" },
※Code Runnerの事前インストールが必要です。
まとめ
自分が、C++で開発していたのは、SIer時代の約9年前に1年ほどファイル処理系のバッチ開発で利用していたくらいでした。
http/httpsプロトコルなどでのwebで利用した経験は皆無でしたので、今回リクエスト処理を学べてよかったと思いました。
C++プログラム処理自体高速なため、シビアに処理時間問われる箇所は「C++」で書くのもいいなと思いました。