对'SDL_main'的未定义引用

Pri*_*ver 6 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'|
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它.

我已经搜索了本网站上的许多问题和其他教程(主要是关于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();
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*rek 18

尝试#undef main所有SDL相关标头.

更新.这不是一个有效的解决方案!

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

拦截的工作原理是用SDL_main一个简单的宏替换用户主函数的名称

#define main SDL_main
Run Code Online (Sandbox Code Playgroud)

然后,用户的功能不再是应用程序的入口点,并使用SDL提供的入口点.建议不#undef加肆地禁用拦截,并且应该争辩说它根本不应该起作用.对于那些在"修复"之后成功编译并运行SDL应用程序的人来说,它必须简单地依赖于平台.

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

  • 为什么这会解决问题? (3认同)
  • 你在开玩笑......我希望我早一个小时找到这个.致力于OSX. (2认同)

小智 16

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

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

  • @JochemKuijpers需要此特定签名,因为SDL会更改默认程序入口点解析.在正常情况下,你可以使用许多标准签名之一为主函数,`int main()`,`void main()`,`int main(int,char**)`等.编译器将接受所有这些变种.但是SDL拦截了主要入口点,如我的回答所述,并且调用您的入口点期望特定签名,这不再受编译器解释的影响. (3认同)

jro*_*rok 5

我能想到的问题唯一可能的原因是当你用main它创建文件时,你忘了将它添加到构建目标.

在此输入图像描述

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

在此输入图像描述

单击"确定",按Ctrl + F11("重建").

祝好运.