けせらせらのブログ

数学やプログラミングを中心に感想を流していきます。

謎エラー~未解決の外部シンボル~の出現

ただいま第5章と第10章を見ながらシークエンス遷移の作成に挑戦している筆者ですが、丸々3日ほど悩んだエラーを紹介します。

エラーの紹介

  • 未解決の外部シンボルが関数~~で参照されています

これは宣言のみ行って定義が行われていない場合に起こります。とても分かりやすいです。
恐らくこれを聞けば、なんとなくやるべきことがわかる人が多いと思います。
一言でいうと定義をしてやればいいのです。
つまり、 宣言はしているが定義していない関数を実際に使うファイル内で定義してあげる。または、該当するヘッダファイルをインクルードする。などの対処が考えられます。

しかし、筆者の場合は定義もインクルードもしっかり行っていました。
そうです!この対処で終わるのなら筆者は3日も悩んでいないのです!
つまり、別のアプローチをしなければなりません。今回は以下の警告を軽視してはいけないようでした。

無視してはいけなかった警告

  • Two or more files with the name of ~~~

それが上の警告(の一部)です。全体の内容としては「同じ名前のファイルがあるから、ビルドしたときによくないことが起こるかもよ!」みたいなことです。はい。見事に今回よくないことが起こってしまいました。
なので、指定されたファイル名を変更し、見事解決。
しかし、まだ悪夢は続きます。

颯爽と現れる「"CL.exe"はコード2を伴って終了しました」

このエラーはどうやら環境が壊れている時や、何かしら大事なファイルが足りない時に起こるようです。 このエラーはだいぶ悩みました。何せ、エラーから何が悪いのかが全く読み取れない。適当にインクルードやライブラリのパスを調べたりもしました。
ここで筆者が気になったのが、以前ファイル名を変えたり、ファイルを削除したりしていたことです。もしそれが原因ならば、悪いのは諸々のパスの設定でも、コードでもなく、ファイル自体に変更を加えたことによるものだと思えます。では、その変更前の情報を削除できればよいのでは?となり、ソリューションのクリーンを行うときれいに解決。なんというか、こんなもんかと思ってしまいました。

追加 3つめのエラーですが、void型ではない関数において、returnを書かないと起こることがあるそうです。(実際に起こしました…)



残る疑問点

2つ目の警告ですが、僕が無視をしていたのにも理由があります。「プログラマになる前に覚えておきたい技術」を読んでいる方はわかると思いますが、本書でも同じ名前(Child,Parent)のファイルを別ディレクトリで作成しています。私も同様に作成していたので「まさかこれがエラーだなんて…」と思ってスルーしていました。これは正直私のミスなのか、バージョンの違いによるものなのかは分かっていません。
また、3つ目のエラーに関してですが、いろいろ検索した結果このエラーはどうやら原因の特定が難しいらしく今回言及した内容も本当にそれが原因かどうかはわかりません。なので、これはあくまである限定された状態での解決法の一つという域を出ないように思えます。

しかし、何とかこれで派生クラスを用いたシークエンス遷移を荷物君に実装することができました。
めでたしめでたし。

今回作成したソースコードこちら