けせらせらのブログ

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

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

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

エラーの紹介

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

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

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

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

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

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

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

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

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



残る疑問点

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

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

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

「プログラマになる前に覚えておきたい技術」の第2章以降のサンプルプログラムが動かない!!!

今回のテーマは「プログラマになる前に覚えておきたい技術」(以下 本書)を読むにあたって恐らく一番の難関です。少なくとも僕にとってはかなりの難関でした…
特にVisualStudioを使い慣れていない方はバージョンの違いによるエラーにかなり苦しむと思いますし、このサイトにたどり着いた方はそういう方だと思います。

では、これから出会うであろう(既に出会ったであろう)エラーやトラブルを(覚えている限り)列挙していきます。僕は以下の作業を2012年版のサンプルコードに対して行いました。 基本的にこれらのエラーは言語やVisualStudioのバージョンの違いによるものです。

ちなみに筆者の環境は

  • Windows10
  • VisualStudio 2019

です。(情報はこれで足りてるのかな…)

確認されたエラー


  1. 'max': 識別子が見つかりませんでした

  2. 'RuntimeLibrary'の不一致が検出されました。値'Mtd_StaticDebug'がMDd_DynamicDebugの値'File.obj'と一致しません。

  3. '_MSC_VER' の不一致が検出されました。値 '1700' が 1900 の値 'File.obj' と一致しません。

  4. ファイル"xx.xx"が開けません


1について
これはstd::maxstd::minalgorithm.hに存在しているために起こる現象です。#include <algorithm>をコードに追加すると治ります。


2について
これは独自のプロジェクトを作成したときに起こる印象です。プロジェクト -> プロパティ -> C/C++ -> コード生成 で表示される画面内のランタイムライブラリの欄を画面左上の構成をDebugにして「マルチスレッドDLL (/MD)」に変えてください。構成Releaseにおいては問題なかったはずです。


3について
この問題についてはこちらを参照してください。


4について
恐らく、環境変数GAME_LIB_DIRの設定ミスか、あるプロジェクトを選択した状態で プロジェクト -> プロパティ から設定できる追加のインクルードディレクトリの設定などが原因かもしれません。どちらも本書第2章に記載してあるのでもう一度確認してみましょう。

(追加)
別のミスとしてVisualStudioでプロジェクトを立ち上げる際に聞かれる「プロジェクトテンプレート」の選択ミスです。第1章はコンソールアプリ。第2章以降はデスクトップアプリを選択しましょう。


 参考にしたサイト及びページ

別アプローチ


ゲームプログラマーになる前に覚えておきたい技術 近代化プロジェクト

こんなのもあるみたいです。参考にしてみてください。

数学かプログラミングか...

自己紹介


こんにちは。ハンドルネームは「けせらせら」です。 初めてなんで簡単な自己紹介をします。

  • 数学科のM1
  • 使用言語 : Haskell(競プロ、研究),C++(ゲーム制作)
  • AtCorder(keserasera_77) : 茶色
  • 水樹奈々さんが好き

ってな感じです。ちなみに数学科のM1と書くと強そうですが、恐らく少し頭のいい理系高校生を持ってこられると1撃で死にます。そのぐらいのレベルです。

今後の記事の方針


  1. ゲーム制作について
  2. 競技プログラミングについて
  3. その他(数学、就活etc...)

がメインになると思います。 (数学についてはよわよわなのであまり記事は書かないと思います…)

1については「ゲームプログラマになる前に覚えておきたい技術」(著・平山尚)を読んだ感想を随時書いていく予定です。結構ハマってしまって、今は数学よりこっちのほうが楽しいです。(現時点で3章まで読み終わっています)

2についてはAtCoderに参加した感想や、解法について言及する予定です。ただ、今現在茶色で恐らく実力は緑下位~中位停滞レベルだと思っています。目標は水色で、そこまでいけば取り敢えず一段落かなと思っています。 アカウントは「keserasera_77」です。適当に見て「数学科のM1でもこんぐらいの人はいるんだなぁ」ぐらいの精神安定剤にしてあげてください。

3については本当に気分ですね。なんか気分が乗ったら記事を書くかもしれません。

まとめ

こんな感じで緩くやっていくつもりです。

ブログに関しても初心者なので、もし間違い等があれば遠慮なく指摘していただければと思います。

よろしくお願いします。