【D言語】リンカエラー LNK4255
突然よりよい設計が降ってきたので、ディレクトリ構造が変わるレベルのわりと大きなリファクタリングをしていた。
しかし、いざ完了してコンパイルしてみると、何やら妙なリンカエラーが出るのだ。
LNK4255 ?
warning LNK4255: ライブラリは、同じ名前の複数のオブジェクトを含んでいます。デバッグ情報を伴わずにオブジェクトをリンクしています
はて? 何のことだろう?
どうやらデバッグビルドでしか発生しないようだ。
おまけに、コンパイルは問題なく終了し、吐き出されたアプリケーションは見た感じ普通に動作している。(ちなみに dmd は v2.097.0)
別に動くんだからいいじゃないかと考えてもいいが、こんな警告はいままで見たこともないし、やはり warning
なんて気持ちのいいものじゃない。
しかし、なんとかしようと検索してもほとんどそれらしい情報が見つからない(いつもの)
大体、もしも「同じ名前のオブジェクト」なんか含んでたら、そりゃ コンパイルエラー なのでは…?
原因(たぶん)
どうやら、module
の指定が問題だったらしい。
プロジェクト(出力形態は静的ライブラリ)が例えばこのような構成だったとして…
.dub source project aaa my_program.d bbb my_program.d .gitignore dub.json
それぞれのソースコード my_program.d
の module
定義がこうなっていた場合…
// aaa\my_program.d module project.aaa.my_program;
// bbb\my_program.d module project.bbb.my_program;
たとえ途中のパッケージ名が異なっていたとしても my_program
というモジュール名が被っているがゆえに警告になることがあるらしい。
実際、片方の my_program
のモジュール名(およびファイル名)を改名したところ、無事 LNK4255
は出なくなった。
しかし、おかしい… なんでこんなことになるんだろう? パッケージ名が異なっていればそれは別のシンボルでしょ? アクセス修飾子に package(...)
構文を使ったからかな?
正直、詳しい原因はよくわからん。
まあ直ったからええか…
また暇があったら調べておこう(絶対やらないやつ)