11

最近、CodeBlocks10.05を使用してSDLを使用することにしました。私はhttp://www.sdltutorials.com/sdl-tutorial-basicsのチュートリアルから始めて、それに従うために最善を尽くしました。残念ながら、私は遭遇しています:

..\..\..\..\..\..\SDL\SDL-1.2.15\lib\libSDLmain.a(SDL_win32_main.o):SDL_win32_main.c|| undefined reference to `SDL_main'|

コンパイルしようとすると。

このWebサイトや他のチュートリアル(主にLazyFooとCodeBlocks wikiのチュートリアル)で多くの質問を検索しましたが、解決策が見つからないようです。

  • C:\ SDL \ SDL-1.2.15 \ includeが[コンパイラ]タブ(ディレクトリの検索)に追加されました
  • C:\ SDL \ SDL-1.2.15\libが[リンカー]タブに追加されました
  • ライブラリlibmingw32.a、libSDLmain.a、libSDL.dll.aはこの順序でリンクされています
    • CodeBlocksインストールディレクトリのMinGW\libフォルダにあるlibmingw32.a
  • SDL.dllは、System32フォルダーとプロジェクトフォルダーの両方にあります。

CodeBlocks wikiのチュートリアルに従おうとすると、(新しいSDLプロジェクトを作成するときに)指定されたディレクトリにSDL.hが見つからないと言われました。

CApp.cpp

#include "CApp.h"
#include "SDL\SDL.h"

CApp::CApp(){
    Surf_Display=NULL;

    Running=true;
}

int CApp::OnExecute(){
    if (OnInit()==false){
        return -1;
}

SDL_Event Event;

while (Running){
    while (SDL_PollEvent(&Event)){
        OnEvent(&Event);
    }
    OnLoop();
    OnRender();
}

OnCleanup();
return 0;
}

int main(int argc, char* argv[]){
    CApp theApp;

    return theApp.OnExecute();
}

CApp.h

#ifndef CAPP_H_INCLUDED
#define CAPP_H_INCLUDED
#include "SDL\SDL.h"

class CApp{
    private:
        bool Running;
        SDL_Surface* Surf_Display;

    public:
        CApp();
        int OnExecute();

    public:
        bool OnInit();
        void OnEvent(SDL_Event* Event);
        void OnLoop();
        void OnRender();
        void OnCleanup();
};



#endif // CAPP_H_INCLUDED
4

5 に答える 5

18

#undef mainすべてのSDL関連ヘッダーの後で試してください。

アップデート。これは有効な解決策ではありません!

HolyBlackCatが指摘しているように、これはかなりずさんな修正です。SDLは、他の方法では不可能な初期化やクリーンアップを実行するためにmain関数を置き換えてから、実際のユーザー関数を呼び出します。

SDL_mainインターセプトは、ユーザーのメイン関数の名前を単純なマクロに置き換えることで機能します

#define main SDL_main

その後、ユーザーの機能はアプリケーションのエントリポイントではなくなり、SDLによって提供されるエントリポイントが使用されます。提案され#undefたものは無謀に傍受を無効にし、それがまったく機能しないことになっていると主張する必要があります。この「修正」の後でSDLアプリケーションを正常にコンパイルして実行した人にとって、それは単にプラットフォームに依存する偶然の一致であったに違いありません。

OPのエラーに対する適切な解決策は、を含むファイルmainがコンパイルおよびリンクされ、関数が正しい署名を持っていることを確認することです。すでに他の人が投稿したように。

于 2012-05-29T18:19:14.390 に答える
7

私が考えることができる問題の唯一のもっともらしい理由は、ファイルを作成したときにmain、それをビルドターゲットに追加するのを忘れたことです。

ここに画像の説明を入力

main.cpp があるリストに CApp.cpp が表示されます。それを右クリックして、[プロパティ]をクリックします。ポップアップ ウィンドウの [ビルド] タブをクリックします。次のように表示されます。

ここに画像の説明を入力

[OK] をクリックし、Ctrl+F11 (再構築) を押します。

幸運を。

于 2012-05-30T17:15:11.303 に答える