Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
R&D 祭 2024 今だ!ABI問題
Search
OLM Digital R&D
PRO
May 17, 2026
Technology
70
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
R&D 祭 2024 今だ!ABI問題
OLM Digital R&D
PRO
May 17, 2026
More Decks by OLM Digital R&D
See All by OLM Digital R&D
R&D 祭 2024 SIGGRAPH ASIAで会いましょう&クロージング
olmdrd
PRO
0
77
R&D 祭 2024 OLM Open Tools:アニメ業界を幸せに
olmdrd
PRO
0
110
R&D 祭 2024 UE5で絵コンテ・作画の制作支援ツールをつくる話
olmdrd
PRO
0
270
R&D 祭 2024 アニメエフェクト作成の効率化
olmdrd
PRO
0
140
R&D 祭 2024 社内ITインフラを紹介 2024
olmdrd
PRO
0
94
R&D 祭 2024 GitHub Enterprise 導入とActionsの活用
olmdrd
PRO
0
61
R&D 祭 2024 パイプラインツール紹介+Adobe CEP開発
olmdrd
PRO
0
120
R&D 祭 2024 脱XGen:OLM Hair and Feather
olmdrd
PRO
0
71
R&D 祭 2024 オープニング 祭の見どころ紹介とSAKUGADOも
olmdrd
PRO
0
66
Other Decks in Technology
See All in Technology
DevOps Agentで始めるAWS運用 〜フロンティアエージェントが変える運用の現場〜
nyankotaro
1
230
サプライチェーンセキュリティの空白地帯 - 信頼できる”依存性”の未来を考える
rung
PRO
2
700
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
2.7k
AI Engineering Summit Tokyo 2026 AIの前に、やることがある 〜医療データ企業の4フェーズ〜
dtaniwaki
0
1.8k
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.5k
Agentic Web
dynamis
1
130
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
470
さきさん文庫の書籍ができるまで
sakiengineer
0
370
Djangoユーザが知っ得なPostgreSQL機能 - 設計の選択肢を増やす / Djang-use-PostgreSQL
soudai
PRO
0
180
AI と創る新たな世界 / A New World Created with AI
ks91
PRO
0
110
Dario Amodi『Policy on the AI Exponential』を理解する
nagatsu
0
190
トークン数だけでは測れない — Claude Code 組織展開の効果検証から学んだこと
makikub
0
130
Featured
See All Featured
The Spectacular Lies of Maps
axbom
PRO
1
790
Building the Perfect Custom Keyboard
takai
2
780
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
820
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
130
Leo the Paperboy
mayatellez
7
1.8k
Rails Girls Zürich Keynote
gr2m
96
14k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
今だ!ABI問題! Marc Salvati © OLM Digital, Inc. 1
前回:Maniacコード コード 企画 ビルド テスト リリース デプロイ 管理 監視 DEV
開発 OPS 運用 要望とアイデア の管理 ソースコードの バージョン管理 自動コンパイル 開発環境の自動構築 自動インストール 結合テスト バージョン番号 の決め方 2 © OLM Digital, Inc.
今回の内容 コード 企画 ビルド テスト リリース デプロイ 管理 監視 DEV
開発 OPS 運用 ABI問題 3 © OLM Digital, Inc.
概要 • VFX Reference Platform • ダイナミックライブラリ • ABIについて •
CMakeでABI問題の対応 • まとめ 4 © OLM Digital, Inc.
VFX Reference Platform • 映像業界の様々なバージョンの統一 – DCCの使用するコンパイラ – DCCの使用するライブラリ –
Diamond(菱形)依存関係を防ぐ • 映像会社とソフト会社の協力 – Linuxの対応のハードルを下げる – 一緒に決める 5 © OLM Digital, Inc.
VFX Reference Platform • 2023年からNew libstdc++ ABIに切り替え推進 • DCCが2024年で切り替え –
Maya 2024、Nuke 15 • 必要な対応 – New libstdc++ に切り替え – ABI二つの対応 • libstdc++ • New libstdc++ • Maya 2023まだ使っているから 6 © OLM Digital, Inc.
• ランタイム – スタンダード – libstdc++, vc… • 外部ライブラリ –
OpenCV – Boost – … • 二種類 – スタティック – ダイナミック 実行ができる ライブラリについて コード ダイナミック ライブラリ バイナリ コンパイル されたコード 実行できる プログラム リンク ライブラリ のヘッダー … コンパイル ダイナミック ライブラリ バイナリ 7 ライブラリ バイナリ © OLM Digital, Inc.
ダイナミックライブラリについて • いいところ – 更新が可能 • 後方互換性が必要 • バグを見つけたら修正されたバイナリ配布 ‐
セキュリティ問題 – プラグインの仕組みが可能 • Maya、AEなどのプラグインはダイナミックライブラリ • 悪いところ – 勝手に更新されてクラッシュの原因になる • OSのライブラリ更新時 • ソフトのインストール時 – ABI問題が置きやすい 8 © OLM Digital, Inc.
ABIってなに? アプリケーションバイナリインタフェース(ABI, 英: Application Binary Interface)とは、 アプリケーション(ユーザ)プログラムとシステム(オペレーティングシステムやライブラリ) との間の、バイナリレベルのインタフェースである。 また、アプリケーション相互間や、それらの部品(プラグイン等)との バイナリインタフェースもある。
Wikipediaより 9 © OLM Digital, Inc.
ABIってなに? 10 © OLM Digital, Inc. • バイナリフォーマット – C++の関数名
– 型名、レイアウト – 関数の呼び方 – パラメータの使い方 – など – 参考:What is ABI, and What Should WG21 Do About It? • OS依存 – WindowsでコンパイルされたものをLinuxで使えない • コンパイラ依存 – MinGWとVC++でコンパイルされたものを一緒に使えない • インターフェースなので互換性が大事!
• コンパイルされたライブラリで実行可能 ABIの互換性 ダイナミックライブラリV2 実行ができる プログラム 使用 コードのバイナリ 実行ができる プログラム
リンク コンパイル ライブラリ バイナリ V2 ライブラリ ヘッダー V2 プログラム ライブラリ ヘッダー V2 ライブラリ バイナリ V2 ライブラリ バイナリ V2 © OLM Digital, Inc. 11
• 後方互換性 – 古いライブラリでコンパイルされたものが新しいバージョンで実行可能 ABIの互換性 ダイナミックライブラリV2 後方互換性があ れば実行できる プログラム 使用
コードのバイナリ 実行ができる プログラム リンク コンパイル ライブラリ バイナリ V2 ライブラリ ヘッダー V2 プログラム ライブラリ ヘッダー V2 ライブラリ バイナリ V2 ライブラリ バイナリ V3 © OLM Digital, Inc. 12
• 前方互換性 – 新しいライブラリでコンパイルされたものが古いバージョンで実行可能 ABIの互換性 ダイナミックライブラリV2 前方互換性があ れば実行できる プログラム 使用
コードのバイナリ 実行ができる プログラム リンク コンパイル ライブラリ バイナリ V2 ライブラリ ヘッダー V2 プログラム ライブラリ ヘッダー V2 ライブラリ バイナリ V2 ライブラリ バイナリ V0 © OLM Digital, Inc. 13
APIの互換性の問題発生 • APIの互換性がない → ABIの互換性がない header.h #include “header.h” int main() { void
fly(10.0f); return 0; } 14 © OLM Digital, Inc. mylib Version 1ライブラリ void fly(float speed); mylib Version 2ライブラリ void fly(float speed, float altitude); myprogram.c 実行環境 Version 1でコンパイル myprogram.exe myprogam Version 2ライブラリ mylib.dll mylib.so
• C/C++ では一つの定義のルール(One Definition Rule) • 同じ名前なのに定義が違うものだと>> Undefined behavior 実行環境
Version 1でコンパイル myprogram.exe myprogam ABIの互換性の問題発生 Version 2ライブラリ mylib.dll mylib.so mylib Version 1ライブラリ struct MyStruct{ int a; int b; }; mylib Version 2ライブラリ struct MyStruct{ int a; int b; Int c; }; 15 © OLM Digital, Inc. header.h #include “header.h” int main() { MyStruct s; s.a = 1; s.b = 2; return 0; } myprogram.c
• 互換性を簡単になくせる – データのレイアウトの変更 – クラスの構造の変更 – virtualの追加 – …
• 参考 – KDE、Oracle、WG21 ABIの互換性の問題発生 16 © OLM Digital, Inc.
映像制作でのABI問題 • DCCプラグインとDCCのライブラリのABI互換性が必須! • ランタイム – 前方互換性がない – VC++のランタイム •
2015年移行互換性あり? – libstdc++ • GCC5.1、2015年で後方互換性を壊した • 2015年でDeprecatedの導入、APIの互換性を壊す? • SDK – 前方互換性がない – 後方互換性はバージョン次第 • 殆どあり: ArnoldとAE • 殆どなし: Mayaと Nuke 17 © OLM Digital, Inc. VC++2017でのエラー Error C2338… Before VS 2017 15.8, the member type would non-conformingly have an alignment of only alignof(max_align_t). VS 2017 15.8 was fixed to handle this correctly, but the fix inherently changes layout and breaks binary compatibility…
ABI問題の対応 • プラグインのコンパイル – DCCの推薦するコンパイラを使う – バージョン毎にコンパイル • SDKバージョンxコンパイラ バージョン
• MtoAにロードされるので、Arnoldも! • 外部ライブラリ – 再帰的に全ての依存ライブラリ – ソースからコンパイル • プラグインと同じコンパイラ – Linuxでは二つのバージョンをコンパイル • _GLIBCXX_USE_CXX11_ABI=1 • _GLIBCXX_USE_CXX11_ABI=0 • ビルド時相応しいバージョンとリンク 18 © OLM Digital, Inc.
ランタイムのバージョンでさらにややこしい • LinuxではDistroのlibstdc++が固定 – 更新可能ですが・・・ – devtoolsetでごまかしてたり • 新しいABIをStaticリンクで •
注意:DTS 6-7 が_GLIBCXX_USE_CXX11_ABIを無視 • Windowsのバージョンわかりにくい – 2017からDLLの名前が変わらない – Propertiesで確認・・・ 19 libstdc++.so.6.0.25 libstdc++.so.6.0.28 © OLM Digital, Inc.
ABI問題の対応 • プラグインのコンパイル – DCCの推奨コンパイラを使う – バージョン毎にコンパイル • SDKバージョンxコンパイラ バージョン
• MtoAにロードされるので、Arnoldも! • 外部ライブラリ – 再帰的に全ての依存ライブラリ – ソースからコンパイル • プラグインと同じコンパイラ – Linuxでは二つのバージョンをコンパイル • _GLIBCXX_USE_CXX11_ABI=1 • _GLIBCXX_USE_CXX11_ABI=0 • ビルド時相応しいバージョンとリンク 20 コンパイラ指定問題 ABI指定問題 →CMakeで解決 © OLM Digital, Inc.
• モダンCMakeデファクトスタンダード なぜCMake? コード 内部ライブラリ 外部ライブラリ 内部ライブラ リのバイナリ 外部ライブラ リのバイナリ
コンパイルさ れたコード 実行ができる コード コンパイル リンク … add_executable(application1) target_sources(application1 PRIVATE src.cpp src.h) target_compile_features(application1 PRIVATE cxx_std_14) find_package(library1) target_link_libraries(application1 PRIVATE library1) 21 © OLM Digital, Inc.
• DCCの対応はさまざま – モダンCMake対応 • Nuke • Houdini – CMake対応
• Maya ‐ モダンではない • ターゲットの定義がない • 配布されているQtのCMakeの使用が難しい – CMake非対応 • Arnold, After Effects, Photoshop • 外部ライブラリ大体モダンCMake対応 – OpenCV, Qhull, Eigen… 映像制作においてのモダンCMake対応 22 © OLM Digital, Inc.
コンパイラを指定する • WindowsはコマンドラインのGeneratorで回避 – Visual C++しか使われていない – ex: -GVisual Studio
15 2017 Win64 • Linux – GCCしか使われていない – GeneratorではGCCのバージョンの指定不可能 – CMAKE_C_COMPILER、CMAKE_CXX_COMPILERだけでは不十分 – PATHの最初に追加する – sclを推奨 23 © OLM Digital, Inc.
ABI指定 • _GLIBCXX_USE_CXX11_ABIの切り替え • ソースのコンパイルのABI指定 – コマンドのフラグ • New ABI:
-D CMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=1' • Legacy ABI: -D CMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' – ソースからのライブラリもこれで • ライブラリのABIバージョン – find_packageにはABI系のパラメータがない 24 © OLM Digital, Inc.
• 依存の必要なフラグ、ヘッダーなど推移的に • ライブラリからプログラムへ B が必要 c++11 OpenMP CMakeで推移的な解決 Library
A Library B プログラム Uses Uses プログラムが必要 C++17 OpenGL OpenMP A が必要 c++14 A requires from B OpenMP C が必要 C++17 OpenGL Library C Uses 25 © OLM Digital, Inc.
ライブラリのABI指定問題 • 依存関係を推移的な解決が必要 • プログラムからライブラリへ Library A Library B プログラム
new ABI使用 new ABI使用 Maya 2024 New ABI Library C new ABI使用 new ABI使用 26 © OLM Digital, Inc.
• find_packageの検索順番 – デフォルトはModuleからConfig – 指定ができる • Moduleで対応する – 全てのライブラリに必要
if (WIN32) set(OpenCV_DIR "${Path_to_OpenCV_Windows}")#windows, version else() list(FIND CMAKE_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1" index_flags) if(index_flags GREATER_EQUAL 0) set(OpenCV_DIR "${Path_to_OpenCV_Linux_new_ABI}" else() set(OpenCV_DIR "${Path_to_OpenCV_Linux_old_ABI}" endif() endif() find_package(OpenCV ${OpenCV_FIND_VERSION} CONFIG REQUIRED)#because OpenCv has config files ライブラリのABI指定解決手法 例: FindOpenCV.cmake Config モードでOpenCVの設定 ABIフラグのチェック フォルダーの切り替え 27 © OLM Digital, Inc.
まとめ • VFX Reference Platform – 更新で初めてABI問題を意識! – 更新を見ましょう •
対応 – くまなくコンパイル • OS毎に ‐ LinuxのABI毎に • コンパイラバージョン毎に • DCCのSDKのバージョン毎に – CMakeとCIで自動化 28 © OLM Digital, Inc.
今後 • libstdc++に関してはしばらく大丈夫? – 互換性の保証はない – DeprecatedによってAPIの互換性すらなくなる • glibcでさえ勇断ができない •
パッケージマネージャの導入で楽になる? – 全てのライブラリをソースからコンパイル • SIGGRAPH Asiaのコースでより詳細な話 – 2024年12月3日、16時、G602, G Block, Level 6 – CMake、Python、Jenkinsでの自動化 – Security – … 29 © OLM Digital, Inc. glibcのABIの安定 abi-laboratory