none
良くわからないリンクエラーに困っています RRS feed

  • 質問

  •  

    C++のプログラムを作っていて、途中までは何の障害もなかったのですが、画像を読み込んだり描画したりするプログラムを加えたところ、以下のようなエラーが出てしまいました。

    読んでも自分で作った関数などとは関係がなさそうで、どういう事なのか分からずに困っています。

    どなたか教えていただけませんでしょうか。

     

    Main.obj : error LNK2019: 未解決の外部シンボル __imp___CrtDbgReportW が関数 "public: __thiscall std::_Vector_const_iterator<struct AnimDraw::animpat,class std::allocator<struct AnimDraw::animpat> >::_Vector_const_iterator<struct AnimDraw::animpat,class std::allocator<struct AnimDraw::animpat> >(struct AnimDraw::animpat *,class std::_Container_base const *)" (??0?$_Vector_const_iterator@Uanimpat@AnimDraw@@V?$allocator@Uanimpat@AnimDraw@@@std@@@std@@QAE@PAUanimpat@AnimDraw@@PBV_Container_base@1@@Z) で参照されました。


    animdraw.obj : error LNK2001: 外部シンボル "__imp___CrtDbgReportW" は未解決です。


    Main.obj : error LNK2019: 未解決の外部シンボル __imp__memmove_s が関数 "int * __cdecl std::_Uninit_copy<class std::_Vector_const_iterator<int,class std::allocator<int> >,int *,class std::allocator<int> >(class std::_Vector_const_iterator<int,class std::allocator<int> >,class std::_Vector_const_iterator<int,class std::allocator<int> >,int *,class std::allocator<int> &,struct std::_Scalar_ptr_iterator_tag,struct std::_Range_checked_iterator_tag)" (??$_Uninit_copy@V?$_Vector_const_iterator@HV?$allocator@H@std@@@std@@PAHV?$allocator@H@2@@std@@YAPAHV?$_Vector_const_iterator@HV?$allocator@H@std@@@0@0PAHAAV?$allocator@H@0@U_Scalar_ptr_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z) で参照されました。


    animdraw.obj : error LNK2001: 外部シンボル "__imp__memmove_s" は未解決です。


    C:\Documents and Settings\FREIA\My Documents\Visual Studio 2005\Projects\GameFrame\Debug\GameFrame.exe : fatal error LNK1120: 外部参照 2 が未解決です。

     

    お分かりになる方がいらっしゃいましたら、どうかよろしくお願いいたします。

    2007年4月9日 15:48

すべての返信

  • 情報が不足しすぎています。

    • 環境は何か?OS,VCのバージョンまたプロジェクトの種類(MFCなのかCLRなのか等)をきちんと明記してください。
    • >画像を読み込んだり描画したりするプログラム
      とは?具体的にどのような処理を記述しているのでしょうか?



    おそらく、ある関数を使うために,XXX.libをリンクし忘れているのではないでしょうか?(XXXは情報が不明確のため特定できない)
    2007年4月9日 23:53
  • プロジェクトのプロパティを直接弄ったりしてませんか?

    リンク対象になるべきファイルが外れてしまっているような感じがしますけれど。

     

    他の方も書かれていましたが、とにかく出せる情報は全て出すくらいのつもりで

    書き込んだほうが良いです。多分、はじめのうちはどの程度まで出せば十分かと言うのは

    わからないと思いますので。

    あと、追加したソースの出所が分からないので当てずっぽうですが、

    自分の開発環境にあったサンプルで無い場合は読み替えが必要になりますが、

    その辺は大丈夫ですか?

    サンプルコードを丸写ししただけだと開発環境に違いでうまくいかないという事もあるかもしれません。

     

    2007年4月10日 2:09
  •  Anonymous さんからの引用
     

    Main.obj : error LNK2019: 未解決の外部シンボル __imp___CrtDbgReportW が関数 "public: __thiscall std::_Vector_const_iterator<struct AnimDraw::animpat,class std::allocator<struct AnimDraw::animpat> >::_Vector_const_iterator<struct AnimDraw::animpat,class std::allocator<struct AnimDraw::animpat> >(struct AnimDraw::animpat *,class std::_Container_base const *)" (??0?$_Vector_const_iterator@Uanimpat@AnimDraw@@V?$allocator@Uanimpat@AnimDraw@@@std@@@std@@QAE@PAUanimpat@AnimDraw@@PBV_Container_base@1@@Z) で参照されました。

    こちらは2003なので間違っているかもしれませんが、上記エラーから以下の点が原因になっている可能性がありそうです。
    ■プロジェクトのプロパティで「全般」→「文字セットの設定」がマルチバイトになっているのに、「C/C++」→「プリプロセッサ」のプリプロセッサの定義に「_UNICODE」か「UNICODE」が設定されている。
    この場合はプリプロセッサの定義から「_UNICODE」と「UNICODE」を削除すれば解決すると思います。

    ■プロジェクトのプロパティで「C/C++」→「コード生成」のランタイムライブラリが「シングルスレッド (/ML)」又は「マルチスレッド (/MT)」等、後ろにデバッグが付かない物が設定されているのに、「C/C++」→「プリプロセッサ」のプリプロセッサの定義に「_DEBUG」が設定されている。
    この場合「C/C++」→「コード生成」のランタイムライブラリの設定を「マルチスレッド デバッグ (/MTd)」又は「シングルスレッド デバッグ (/MLd)」に変更すれば解決すると思います。
    なお速度を要求してかつマルチスレッドを使用しないプログラムでない限り、「マルチスレッド デバッグ (/MTd)」を選択したほうが無難だと思います。

    2007年4月10日 3:04
  • 経験が浅く、思慮が足りませんでした。

    出来るだけの情報を提示したいと思います。

     

    まず、参考書はボーランドC++を使ってプログラムしていますが、わたしはVS2005を使っています。

    ご指摘のように、この違いでエラーが出ている可能性があるのかもしれません。

     

    開発環境はWinxp VS2005で空のコンソールアプリケーションを使っています。

    ゲームの骨組みになるプログラムを作っていてDxLibというものも使っています。

    以下のプログラムを付け加えたところ、リンクエラーが出るようになりました。

     

    //ヘッダーファイル

    #ifndef __ANIMDRAW_H__
    #define __ANIMDRAW_H__

    #include <vector>
    #include "DxLib.h"
    #include "gameframe.h"
    using namespace std;

    class AnimDraw{
     struct animpat{     //animpat構造体
      vector<int> ghlist;
      int anigap;
      animpat(){     //animpatのコンストラクタ
       anigap=1;
      }
     };
     vector<animpat> aplist;
    public:
     AnimDraw(){      //コンストラクタ クラスと同じ名前の関数
      aplist.push_back( animpat() ); //一つ目のanipatをセット
     }

     int setImage(int apid, int ghandle);//グラフィックハンドルをセットする
     int setGap(int apid, int gap);  //表示間隔(anigap)をセットする

     void draw(int apid, int x, int y);   //アニメーション表示
     void draw(int apid, int x, int y, float rad);//アニメーション回転表示
    };

    #endif

     

    //メイン

    #include "GameFrame.h"
    #include "animdraw.h"

    class CurGame Stick out tongueublic GameFrame{//class 派生クラス Stick out tongueublic 基底クラス
     void drawGameTitle();
     AnimDraw okojyo;
     void loadFiles() throw(int);
     void drawGameMain();
    };
    void CurGame:Big SmilerawGameTitle(){
     int col = GetColor(0,255,128);
     DrawBox(0,0,640,240,col,TRUE);

     GameFrame:Big SmilerawGameTitle();  //基底クラスの関数を呼び出し
    }

    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    {
     CurGame *cg = new CurGame();
     cg->doMainLoop(TRUE);
     delete cg;
     /*GameFrame *gf = new GameFrame();
     gf -> doMainLoop(TRUE);
     delete gf;*/
    }

    void CurGame::loadFiles() throw(int){
     int ghandleMusic;
     if(LoadDivGraph("okojyo.bmp",8,4,2,64,64, ghandle) == -1) throw(-1);
     okojyo.setImage(0,ghandle[0]);
     okojyo.setImage(0,ghandle[1]);
     okojyo.setImage(0,ghandle[2]);
     okojyo.setImage(0,ghandle[3]);
     okojyo.setGap(0,6);
     okojyo.setImage(1,ghandle[4]);
     okojyo.setImage(1,ghandle[4]);
     okojyo.setImage(1,ghandle[5]);
     okojyo.setImage(1,ghandleDevil);
     okojyo.setImage(1,ghandle[7]);
     okojyo.setImage(1,ghandle[7]);
     okojyo.setImage(1,ghandle[7]);
     okojyo.setImage(1,ghandle[7]);
     okojyo.setGap(1,4);
    }

    void CurGame:Big SmilerawGameMain(){
       GameFrame:Big SmilerawGameMain();//基底クラスの同関数を呼び出し
     okojyo.draw(0,140,300);
    }

     

    //色々と画像処理をしているプログラム

    #include "animdraw.h"

    //画像(グラフィックハンドル)のセット
    int AnimDraw:Tongue TiedetImage(int apid, int ghandle){
     if(apid >= aplist.size()){
      aplist.push_back( animpat() );//新しいアニメパターンの追加
    //apidが追加したアニメパターンを指すように調整
      apid = aplist.size()-1;
     }
     aplist.at(apid).ghlist.push_back(ghandle);
     return(apid);
    }

    //アニメーションギャップのセット(1コマの表示時間)
    int AnimDraw:Tongue TiedetGap(int apid, int gap){
     if(apid >= aplist.size()){
      aplist.push_back( animpat() );
      apid = aplist.size()-1;
     }
     aplist.at(apid).anigap = gap;
     return(apid);
    }

    //アニメーション描画
    void AnimDraw:Big Smileraw(int apid, int x, int y){
     if(aplist.at(apid).ghlist.size() > 1){ //コマ数の確認
      int curpat = GameFrame::getAnimCnt()
       / aplist.at(apid).anigap % aplist.at(apid).ghlist.size();
      DrawGraph(x, y, aplist.at(apid).ghlist.at(curpat), true);
     }
     else{
      DrawGraph(x, y, aplist.at(apid).ghlist.at(0), true);
     }
    }
    //アニメーション回転描画
    void AnimDraw:Big Smileraw(int apid, int x, int y, float rad){
     if(aplist.at(apid).ghlist.size() > 1){ //コマ数の確認
      int curpat = GameFrame::getAnimCnt()
       / aplist.at(apid).anigap % aplist.at(apid).ghlist.size();
      DrawRotaGraph(x, y, 1.0, rad, aplist.at(apid).ghlist.at(curpat), TRUE, FALSE);
     }
     else{
      DrawRotaGraph(x, y, 1.0, rad, aplist.at(apid).ghlist.at(0), TRUE, FALSE);
     }
    }

     

    そして以下のようなリンクエラーが出ています。

     

    Main.obj : error LNK2019: 未解決の外部シンボル __imp___CrtDbgReportW が関数 "public: __thiscall std::_Vector_const_iterator<struct AnimDraw::animpat,class std::allocator<struct AnimDraw::animpat> >::_Vector_const_iterator<struct AnimDraw::animpat,class std::allocator<struct AnimDraw::animpat> >(struct AnimDraw::animpat *,class std::_Container_base const *)" (??0?$_Vector_const_iterator@Uanimpat@AnimDraw@@V?$allocator@Uanimpat@AnimDraw@@@std@@@std@@QAE@PAUanimpat@AnimDraw@@PBV_Container_base@1@@Z) で参照されました。
    animdraw.obj : error LNK2001: 外部シンボル "__imp___CrtDbgReportW" は未解決です。
    Main.obj : error LNK2019: 未解決の外部シンボル __imp__memmove_s が関数 "int * __cdecl std::_Uninit_copy<class std::_Vector_const_iterator<int,class std::allocator<int> >,int *,class std::allocator<int> >(class std::_Vector_const_iterator<int,class std::allocator<int> >,class std::_Vector_const_iterator<int,class std::allocator<int> >,int *,class std::allocator<int> &,struct std::_Scalar_ptr_iterator_tag,struct std::_Range_checked_iterator_tag)" (??$_Uninit_copy@V?$_Vector_const_iterator@HV?$allocator@H@std@@@std@@PAHV?$allocator@H@2@@std@@YAPAHV?$_Vector_const_iterator@HV?$allocator@H@std@@@0@0PAHAAV?$allocator@H@0@U_Scalar_ptr_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z) で参照されました。
    animdraw.obj : error LNK2001: 外部シンボル "__imp__memmove_s" は未解決です。
    C:\Documents and Settings\FREIA\My Documents\Visual Studio 2005\Projects\GameFrame\Debug\GameFrame.exe : fatal error LNK1120: 外部参照 2 が未解決です。

    長くなってしまって大変申し訳ありません。

    こちらを利用するのは2回目なのですが、こんな事を聞いても良いものなのでしょうか。

     

    2007年4月12日 15:37
  •  Anonymous さんからの引用

    まず、参考書はボーランドC++を使ってプログラムしていますが、わたしはVS2005を使っています。

    ご指摘のように、この違いでエラーが出ている可能性があるのかもしれません。

     

    開発環境はWinxp VS2005で空のコンソールアプリケーションを使っています。

    ゲームの骨組みになるプログラムを作っていてDxLibというものも使っています。


    DXライブラリHPの「VisualStudio2005を使用した場合のDXライブラリの使い方」に従って、プロジェクトの作成と組み込みを行いましたでしょうか?
    プロジェクトの種類はコンソールアプリケーションではなく、Win32プロジェクトのWindowsアプリケーションです。
    DXライブラリはVisualC++用を使用していますでしょうか?
    それでも解決しない場合は、DXライブラリHPの掲示板で質問された方が良いと思います。

    2007年4月13日 2:49