对'SDL_main'的未定义引用

时间:2012-05-29 17:30:53

标签: c++ sdl codeblocks

我最近决定尝试使用CodeBlocks 10.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'|

当我尝试编译它时。

我已经搜索了本网站上的许多问题和其他教程(主要是关于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.h(在创建新的SDL项目时)。

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

5 个答案:

答案 0 :(得分:18)

在所有与SDL相关的标题后尝试#undef main

<强>更新。这不是一个有效的解决方案!

正如HolyBlackCat所指出的,这是一个非常草率的修复。 SDL替换main函数以执行一些原本不可能的初始化和/或清理,然后回调实际的用户函数。

拦截的工作原理是将用户主要功能的名称替换为SDL_main,使用简单的宏

#define main SDL_main

用户的功能随后不再是应用程序的入口点,并使用SDL提供的入口点。建议的#undef会无意中禁用拦截,并且应该争辩说它根本不应该起作用。对于那些在“修复”之后成功编译并运行SDL应用程序的人来说,它必须只是一个依赖于平台的巧合。

OP错误的正确解决方法是确保包含main的文件被编译和链接,并且该函数具有正确的签名。正如其他人已发布的那样。

答案 1 :(得分:12)

将这些参数放到main函数中。我也有这个问题,几秒钟前我修好了。

int main(int argv,char ** args) { }

答案 2 :(得分:5)

我能想到的问题唯一合理的原因是,当您在其中创建包含main的文件时,您忘记将其添加到构建目标中。

enter image description here

您应该在我的main.cpp所在的列表中看到CApp.cpp。右键单击它,然后单击“属性”。单击弹出窗口中的“构建”选项卡。你应该看到这个:

enter image description here

单击“确定”,按Ctrl + F11(“重建”)。

祝你好运。

答案 3 :(得分:1)

最近,我遇到了这个问题,观看了一些YouTube视频,还遵循了LazyFoo的安装指南,并且不断收到“未定义对SDL_main的引用”错误。

在成功将minGw文件链接到我的项目属性之后,我遵循了这里所说的所有内容,但是直到我将其添加到主函数int main (int argv, char** args)并起作用后,它才起作用。

using namespace std;

int main(int argv, char** args) {    if(SDL_Init(SDL_INIT_VIDEO)<0)    {
       cout<<"Endl Init Failed."<<endl;
       return 1;    }

   cout<<"SDL Init succeeded."<<endl;

   SDL_Quit();    return 0; }

对于它为什么起作用,我仍然不清楚,但还是可以。

答案 4 :(得分:0)

在包含SDL库之前定义SDL_MAIN_HANDLED

#define SDL_MAIN_HANDLED
#include <GL/glew.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>

更多信息:I'm using the SDL functions without the SDL_main be defined. Is that fine?