A3サイズの升目帖(旧)

ゲーム制作やプログラミングに関する雑記

【D言語】リンカエラー LNK4255

D言語のロゴマーク

突然よりよい設計が降ってきたので、ディレクトリ構造が変わるレベルのわりと大きなリファクタリングをしていた。

しかし、いざ完了してコンパイルしてみると、何やら妙なリンカエラーが出るのだ。


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.dmodule 定義がこうなっていた場合…

// aaa\my_program.d
module project.aaa.my_program;
// bbb\my_program.d
module project.bbb.my_program;

たとえ途中のパッケージ名が異なっていたとしても my_program というモジュール名が被っているがゆえに警告になることがあるらしい。

実際、片方の my_program のモジュール名(およびファイル名)を改名したところ、無事 LNK4255 は出なくなった。


しかし、おかしい… なんでこんなことになるんだろう? パッケージ名が異なっていればそれは別のシンボルでしょ? アクセス修飾子に package(...) 構文を使ったからかな?

正直、詳しい原因はよくわからん。

まあ直ったからええか…

また暇があったら調べておこう(絶対やらないやつ)