Edited at

C++Builder 10.3.2でyaml-cppを使う


yaml-cpp

https://github.com/jbeder/yaml-cpp


動機

PCアプリの動作をカスタマイズする設定ファイルについて消去法で考えると、


  • 階層をサポートしたい

    INIファイルが消える

  • 設定ファイルは人間様が読み書きする

    レジストリ・XMLが消える

  • コメント書きたい

    JSONが消える

で、自分が知っているもので残ったのがyaml

というか、他の案件の客先作成のアプリがyaml-cppを使ってたので使い方を知っていたのが大きい。(但しそのアプリはVisual Studio使ってる)


問題点 (今はあまり問題ではなくなった。はず)

最大の問題点は、今や誰も使ってない(ヲイ)C++Builderでオープンソースのライブラリが使えるのか?という点。

なんせつい2.5ヶ月まではバンドルされてるBoostのバージョンが、従来コンパイラのbcc32では2009年リリースの1.39ってな状態でして。

数年前にリリースされたclangベースの新コンパイラ bcc32c でもBoostのバージョンは2013年リリースの1.55という体たらく。

これがようやく2018/11月のC++Builder 10.3でbcc32cがC++17に対応して、Boostのバージョンも1.68になって巷に溢れるOSSも使えるようになる。はず。

(yaml-cpp自体の要求はC++11準拠でBoostには依存してないけど、新しいBoostが使えれば最近のC++規格に準拠していて安心という事になる)

関係ないけど、2018/11月の10.3リリース時に「Boostはすぐ(年内くらい)に出ます」って言ってたのに、実際にリリースされたのは半年後の2019/5月でこの間10.3が使えなかった恨みは一生忘れない。


結局どうなの?

結論から言うと、3時間くらいでちゃんと使えた。

C++11の件よりも、前バージョンの10.2.3でCMakeが使えるように対応してくれてた事が大きかった。

C++ Builder での CMake の利用

CMakeって今回初めて知ったけど、なんだかスゴいものだね。


手順


  1. CMakeとNinjaをインストール

    C++ Builder での CMake の利用 の通り、CMakeの設定ファイルをRAD Studioからコピーする必要がある事に注意

  2. CMakeを実行

    これも上記URLの通りなんだけど、なんとWin32のコマンドが間違っているので注意されたし

    誤記については、ここがソース。今見てきたらUSのWikiも間違ったままだ。


    • 誤:cmake -DCMAKE_C_COMPILER=bcc32x.exe -DCMAKE_CXX_COMPILER=bcc32x.exe -G Ninja

    • 正:cmake -DCMAKE_C_COMPILER=bcc32c.exe -DCMAKE_CXX_COMPILER=bcc32c.exe -G Ninja

      bcc32x ではなく、 bcc32c

      さらに、yaml-cppではtestとutilでビルドエラーになったので対象から除外した

      cmake -DCMAKE_C_COMPILER=bcc32c.exe -DCMAKE_CXX_COMPILER=bcc32c.exe -G Ninja -DYAML_CPP_BUILD_TESTS=OFF -DYAML_CPP_BUILD_TOOLS=OFF -DYAML_CPP_BUILD_CONTRIB=OFF




  3. build.ninja 変更

    上記の手順で準備はOK、後はninjaを実行すればコンパイル・リンク(アーカイブ)してビルド完了のはずなんだけど、残念ながらアーカイブのtlib.exeでエラーになってしまう。

    原因は「yaml-cpp」の名前にある「-」ハイフン文字。

    tlib.exeは入力ファイル指定に「-」があると「既存ライブラリからモジュールを削除する」指定になる。

    このため、入力ファイル指定のコマンドライン「CMakeFiles\yaml-cpp.dir\src\binary.cpp.obj」が「CMakeFiles\yaml」と「-cpp.dir\src\binary.cpp.obj」に分割され、「CMakeFiles\yaml.obj」から「binary.cpp.obj」を削除しようとしてしまう。


    1. Ninjaのビルド設定ファイル build.ninja 内の文字列「CMakeFiles/yaml-cpp.dir」を「CMakeFiles/yaml_cpp.dir」に置換

      置換対象は「yaml-cpp」だけでなく「CMakeFiles/yaml-cpp.dir」にする事、そうしないと余計なところまで変わってしまう

    2. ビルド出力ディレクトリ「CMakeFiles/yaml-cpp.dir」を「CMakeFiles/yaml_cpp.dir」にリネーム



  4. Ninja実行

    ninja

    yaml-cpp.libが出来れば完了


  5. アプリでのリンク

    IDEでプロジェクトにソースとしてyaml-cpp.libを追加するとリンカが読み込んでくれる。



yaml-cppの使い方

既に別の記事 C++でYMLファイルが読みたい...読めた がある、と思ったけどこれは0.3.0のOld APIだね。

後日別の記事に書く


最後に

Qiita使い始めたばかりで記法に慣れていないので、見にくい所があれば指摘下さい