UE4とRTTI ~MSVC(Windows) V.S. clang(Mac, Linux)~

RTTIとMSVC, clangの環境の違いには気をつけろの情報共有である。

背景

im@sparqlをUE4で触りたいなと思ったら、JSONが使えるようにしたかった。
そこで、ちょうどよいものを見つけたので導入した。

usagi.hatenablog.jp

こいつ(cereal)は最高だ、JSONを構造体のように扱える。
いや、実際に構造体を定義して、そこにJSONを流し込んでるから当たり前だ。

これに関しては、技術書典で頒布した週刊IM@Studyの2019/04号に記載している。
当然リポジトリもある。

github.com

問題

昨年末のpaypay祭りの時に思い切って、ノートPCをWin機からMac機に切り替えた。
当然開発環境は変わり、Xcodeなのでclangとなる。
これが問題。
おうちのデスクトップPCはWin機なため、VS2019のMSVCで作業している。
こいつで動作確認をしているのだが、clangではどうもビルドが通らない。

具体的には、RTTI関連でエラーが出る。
MSVCはRTTIはデフォルトでONなので気にすることは無かったが、cerealではtypeinfoを用いる。
clangではデフォルトでRTTIはOFFなので、エラー文で叱られてしまった。
コンパイラに従いBuild.csでbUseRTTI=true;を指定してビルドすると見知らぬリンカエラーに遭遇した。
似た人↓
https://answers.unrealengine.com/questions/745636/undefined-symbols-for-architecture-arm64-1.html

理由

理由↓
https://answers.unrealengine.com/questions/871773/view.html

意訳すると

  • LinuxではRTTIと非RTTIを混ぜちゃダメ
  • モジュールごとにRTTIの有無は分けられるから、必要な部分に切り出して
  • その時に、Engineのクラスを混ぜちゃダメ
  • それを"ブリッジ"するラッパーを書くのが良い
  • "OpenEXRWrapper"プラグインを参考にしてね

質問者も「Windowsでは動くから、変に気を取られたよ」(意訳)と、自分と同じ心境を語ってる。

現在

モジュール分割をしている。
でも上手くいかない。
C++なんもわからん
何がわからないのか分からない

RTTIとMSVC, clangの環境の違いには気をつけろの情報共有でした。