11

我最近决定尝试使用带有 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
4

5 回答 5

36

将这些参数放到主函数中。我也遇到了这个问题,几秒钟前我就解决了。

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

于 2016-03-20T23:08:12.873 回答
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。右键单击它,然后单击属性。在弹出的窗口中单击构建选项卡。你应该看到这个:

在此处输入图像描述

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

祝你好运。

于 2012-05-30T17:15:11.303 回答
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; }

为什么它起作用我仍然不清楚,但它仍然起作用。

于 2020-08-09T07:10:52.567 回答
0

SDL_MAIN_HANDLED在包含 SDL 库之前定义:

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

更多信息:我正在使用未定义 SDL_main 的 SDL 函数。可以吗?

于 2019-06-16T10:55:05.490 回答