C++ Mac libcurl を使ってみた

こんにちは、Yuuichi(@WestHillWorker)です。

今回は、久しぶりにC++での開発が増えてきそうなので、自分があまり触ってこなかったcurlライブラリについて使い方をまとめてみました。

学習ということもあり、今回も自分のMac環境で全て動作するようにしています。
libcurl
参考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

インストール完了!!
公式サイトからもダウンロードできます。
libcurl

コンパイル方法

自身が作成予定の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">&nbsp;</p>
<p class="copyright"><small>&copy;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++」で書くのもいいなと思いました。


スポンサーリンク
PAGE TOP