• ベストアンサー

外部シンボルの未解決のエラー

 今日ずっとタイトルのエラーの解決を探してたんですが,なかなかうまくいきません.助けていただきたいです.よろしくお願いします.   VC++2008を使ってます.エラーは, ――――― エラー 2 error LNK2001: 外部シンボル ""public: void __thiscall Sequence::Game::Parent::SetSeqID(enum Sequence::Game::Parent::Seq)" (?SetSeqID@Parent@Game@Sequence@@QAEXW4Seq@123@@Z)" は未解決です。 Load.obj ――――― エラー 9 error LNK2019: 未解決の外部シンボル "public: __thiscall Sequence::Game::Parent::Parent(int)" (??0Parent@Game@Sequence@@QAE@H@Z) が関数 "public: void __thiscall Sequence::Parent::Update(void)" (?Update@Parent@Sequence@@QAEXXZ) で参照されました。 Parent.obj という類の2種類のエラーが全部で10個ほどと「外部参照○が未解決です」というものです. Parent.cppというものは  Sequence/Parent.cpp Sequence/Game/Parent.cpp と2種類あります.  ちゃんとSequence/Game/Parent.cppにこのヘッダで宣言したものの定義をかいているんですが, このcppのソースを全部消したり,エラーになるようなことを書いてビルドしても 同じエラーが同じだけでてしまうので, 恐らく,このソースをうまく一緒にコンパイルできてないのだと思います というところまで 今日調べてわかりました. ちゃんとプロジェクトの中には入ってますし,フォルダ構成も間違ってないと思うんですが,リビルトしてみると Parent.cpp が一回しかコンパイルされてません. このエラーの一歩前の段階は Sequence/Parent.cpp に関しての外部シンボルの未解決エラーでした.  解決策をいただきたいです.よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • riwity
  • ベストアンサー率58% (7/12)
回答No.1

このエラーは「関数を宣言しているのに定義していない」場合によく出ます。 Parentクラス内のParent(int)とSetSeqID(...)をよく確認してみてください。 Loadクラスも怪しいです。 あるいはバグがあった頃のまま.objが更新されていないのかもしれません。 プロジェクトをクリーンするなどしてみてください。 ところで、なぜParent.cppが二つあるのでしょう? 別のクラスですか?1つのクラスを2つのcppに分けて書いているのですか?

hourainoas
質問者

補足

 迅速なご返信ありがとうございます. Parentクラス内は何度も見てみましたが,正しく定義もかけていると思います.参考書を見てやっていて,サンプルをそのまま入力してもみたんですが,このエラーが出てしまいました.  わかりづらくてすみません. ゲームのシーケンスを作るために,階層に一つずつparentというクラスを入れるつくりです. よって,別のクラスとなります.よろしくお願いします.

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

とりあえず, 落ち着いて「必要なファイルが全てコンパイル・リンクされている」ことを確認する方がいいような気がするなぁ.

hourainoas
質問者

お礼

お礼はここにまとめて書かせていただきます.  少し煮え切らない解決でしたが,先に進めました,もっと知識が増えたあとでもう一度考えてみたいと思います.  ありがとうございました. ポイントは解決策とは関係をなく配分します. では皆さん,ありがとうございました.またよろしくお願いします.m(_ _)m

hourainoas
質問者

補足

ご返信ありがとうございます.そうなんです,parent.cppのどちらか一つがコンパイルされないようなんです.そこで名前を変えたら, ■■■ できました ■■■ 結局プログラム自体はいじくらなかったんです. 1,Sequence/Parent.cpp の名前を Sequence/GParent.cpp などと変更 2,1をプロジェクトに追加 3,以前の名前のプロジェクトをプロジェクトから除外 4,VC++を再起動 でエラーがなくなりました. そこで時間がある方に回答していただきたいです. 質問1, ディレクトリの階層が違って名前が同じソースファイルがあって,どちらか一つがコンパイルしなかった原因を予想でもいいので教えていただきたいです.(宣言の定義の書かれているソースをコンパイルできなかったからこのエラーがでたと思われます.) 質問2, このような解決策って実際にあるものなんでしょうか.再起動しないと反映されないような.#1さんの言っていた クリーン というのはこういうことなんでしょうか. でも,まずは解決できたのでよかったです. ホントに皆さん考えていただきありがとうございました.m(_ _)m

  • riwity
  • ベストアンサー率58% (7/12)
回答No.4

LNK2001は純粋仮想関数の定義が継承先で無い場合に発生しました。 なので継承に何か問題があるのかもしれません。 親クラスも調べてみては? ちなみに子クラスで純粋仮想関数の宣言が無い場合は、「抽象クラスをインスタンス化できません」とエラーがでます。

hourainoas
質問者

補足

 度々ご返信ありがとうございます. このプログラムには継承を利用していないので(自分はまだ応用できないレベルです,すみません.)継承の問題はないと思います.  さっき開いたら,最初のSequence/Game/Parentに関する10個ほどのエラーとは打って変わって今度はSequence/Parentに関する エラー 2 error LNK2001: 外部シンボル ""public: void __thiscall Sequence::Parent::SetSeqID(enum Sequence::Parent::SeqID)" (?SetSeqID@Parent@Sequence@@QAEXW4SeqID@12@@Z)" は未解決です。 StageSelect.obj というようなエラーが8つほどでてきました.なんなんでしょう... 混乱してきました.

  • nitho_t
  • ベストアンサー率49% (44/89)
回答No.3

宣言の他に定義が存在し、コンパイルエラーではなくてリンカエラーであるのでclass内classの参照とか、namespace内namespaceの問題はクリアしているでしょうから、一番あり得そうなのが、 Load.cppがSequence/直下にあり、各ヘッダーの所在が Sequence/Parent.h Sequence/Game/Parent.h と仮定すると、 Load.cpp(or h)に #include ".\Game\Parent.h"の記述がなければエラー2になるだろうし、 エラー9はLNK2019:で "public: __thiscall Sequence::Game::Parent::Parent(int)"だからint引数のコンストラクタがないんじゃないかな?デフォルトコンストラクタはあっても。 とりあえず予想はこんなところです。

hourainoas
質問者

補足

ご返信ありがとうございます.  Load.cpp(or h) はSequence/Game/Load.cpp(or h)にあり,また, #include "Sequence/Game/Parent.h"と書いてあります.  あぁ,このエラーはそうやって考えるんですか.勉強になります. でも,ちゃんとコンストラクタは設定してありました.    Parentのどちらかが読み込まれないのが気になったのでSequence/Parent.cpp(or h)の方を Sequence/GParent.cpp(or h)にして整理したら 両方コンパイルされるようになったんですが,やはりエラーは変わりませんでした. この同じ名前だとなぜコンパイルされないのか,,それも疑問です. 参考書のサンプルは同じでも平気でした.

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

#1さんが書かれた「関数」の他に、 「変数を宣言したが定義していない」場合も 「外部シンボル未解決」エラーが出ます。 >Sequence/Game/Parent.cppにこのヘッダで宣言したものの定義をかいているんですが, 「このヘッダ」とは、どのヘッダでしょうか? 言及していないため、詳細がわかりません。

hourainoas
質問者

補足

ご返信ありがとうございます.  宣言しただけのものとかがないか今日ずっと探していたんですが,やはりないようです. このヘッダというのはSequence/Game/Parent.h のことです.すみません.慣れないエラーなのでどこを鮮明に言及すればいいかわかりませんでした.  あと,Sequence/Game/Parent.h のように,ディレクトリの中に置いたものは,名前空間Sequence , Game を利用して合わせています.  自分が気になるところを言及させていただくと, Sequence/Game/Parent.h に Sequence::Game::Parentのクラスなど宣言 Sequence/Game/Parent.cpp に その定義 を書いています. それで↑の.cppの方を消してもそれに関してのエラーは出ずに,今までと同じエラーがでるので,これが読み込まれていないのではないかと感じました.その解決策がわからないのです. よろしくお願いいたします.m(_ _)m

関連するQ&A

専門家に質問してみよう