C ++程序和SDL中的main()冲突

时间:2015-10-13 08:42:10

标签: c++ qt sdl

我在Windows操作系统下使用QT Creator的简单程序中使用SDL。但是当我构建代码时,遇到以下链接错误。

MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

我完成了代码,发现我的main()文件无法识别.cpp,因为SDL_main.h中引用了相同的关键字,如下所示:

#define main SDL_main

/** The prototype for the application's main() function */
extern C_LINKAGE int SDL_main(int argc, char *argv[]);

当我单击.cpp文件中的main函数时,我跳转到SDL_main.h中的定义,该定义验证是否存在某种冲突。

所以,我猜连接器无法识别我的.cpp文件中的main()。 这是我的代码:

#include <QtCore>
#include <opencv2/opencv.hpp>
#include "vlcvideocapture.h"



int main()
{
    clsVlcVideoCapture videoCapture("ip.camera");
    int key = 0;
    while(key != 27) {
        cv::Mat frame;
        int frameNumber = videoCapture.grabFrame(frame);
        if(frameNumber == -1)
            continue;
        cv::imshow("frame", frame);
        key = cv::waitKey(30);
    }
    return 0;
}

这里发生了什么以及如何以合理的方式解决这个问题。 任何帮助将不胜感激。

更新

有些人说使用#undef main但是当我这样做时,会弹出以下错误:

cannot initialize SDL

1 个答案:

答案 0 :(得分:2)

SDL Wiki基本上提供this example

#define SDL_MAIN_HANDLED
#include "SDL.h"

int main()
{
    SDL_SetMainReady();
    SDL_Init(SDL_INIT_VIDEO);

    ...

    SDL_Quit();
}

定义 SDL_MAIN_HANDLED 可避免将main定义为宏。

调用 SDL_SetMainReady() 是必要的,以模仿SDL&#39; main的效果(该功能就是出于此特定目的)。

为了避免SDL定义main函数,看来您需要做的就是不与&#34; SDL2main&#34;库。

引用a posting somewhere by someone,关于此:

  

SDL2main和SDL2test是SDL2的两个辅助库。

     

SDL2main提供SDL_main(),它是所有SDL应用程序的全局入口点。您不需要/被迫使用它,但是存在是基于SDL支持的各种系统。 Windows使用WinMain(),Linux使用main(),Android需要JNI,而某些Java实际使用SDL,因此SDL_main()使事情变得更容易。

     另一方面,SDL2test提供了一些与SDL目的无直接关系的功能。有些对于普通程序很有用,有些则与测试程序直接相关,您可以选择使用它们或忽略它们。

     

如果您想使用SDL2,则不需要SDL2main或SDL2test,它们只是一些不错的选择。