日報(2020-12-15) POCO を static に link するとかなりでかい

はじめに

POCO のアーカイブライブラリをビルドして、アプリケーションに static にリンクする話を以前 こちら に書いた時は、アーカイブライブラリのビルドを ./configure --static と紹介させていただいたのですが、今どきな CMake だとどうするんだろうと思って POCO の CMakeLists.txt を眺めてみたら -DBUILD_SHARED_LIBS=OFF でいいみたいで、GET POCO のこちらの手順は

cmake .. && cmake --build .

以下のようにするとアーカイブライブラリ (.a) ができます

cmake -DBUILD_SHARED_LIBS=OFF .. && cmake --build .

HTTPS

C++ で HTTPS が意外(でもないか、どんな些細な事でも C++ で書きさえすれば泣きたくなるほどウザくなるのはあたりまえかも)とめんどくさく、asio のサンプル通りに書くと HAproxy の acl のホストヘッダでの振り分けにひっかからないし、curl は依存関係が無駄にジャングルで static link するのに何が必要なのかちょっとわからないし、謎なクライアントを github にあげてくださってる方がいたりするのですが「SSL 1.1.0 はサポートしてません」なんて大胆なメッセージがでてくるし(頑張ってサポートしてる私のほうが間違ってる?)で、1日無駄にしてしまったりします

で、こちらの方の POCO で HTTPS を実装されたサンプルをみて「そういえば POCO があったな」と思い出したのでした。Maya Posch さんの Cerflet とか POCO つかって 80行(!)ぐらいで Web Server 書いてらして、C++ なのに簡明に書ける書き味に感銘をうけた思い出があります

ビルドしたら以外とでかい

こちら を static にリンクしてみようとおもって、Poco::Net ぐらいでいいのか、SSL だから Crypto ぐらいかなとおもったら全然足りなくて、エラーメッセージに応じてどんどん継ぎ足していったら最終的にこんなかんじにふくれあがってしまいました

g++ get.cpp -Wl,--start-group -Wl,-Bstatic -lPocoJSON -lPocoXML -lPocoUtil -lPocoCrypto -lPocoNetSSL -lPocoNet -lPocoFoundation -Wl,--end-group -Wl,-Bdynamic -lpthread -lssl -lcrypto -ldl -lm

うーむ、なんで JSON とか XML とか必要になるのか謎です

で、できあがったオブジェクトは

-rwxr-xr-x  1 ueda ueda 29000392 Dec 15 10:38 a.out

30MB, かなりデカイです。gin で ping だけみたいなサーバ作ってだいたい 10M ちょっと、それに SQL だの FireBase だの(どうして DBMS 2種類もつかってるんだか)ゴテゴテと足していって 25MB ぐらいなので、これはかなりデカイです

感想

C++ なので仕方ないのかもしれません


Last Updated: 12/15/2020, 11:22:57 AM