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

main() conflict in a C++ program and SDL

本文关键字:冲突 main 中的 程序 SDL c++      更新时间:2023-10-16

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

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

我通过代码发现在我的.cpp文件中不能识别main(),因为在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

SDL Wiki基本上提供了这个例子:

#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的main的效果(该函数的存在是为了这个特定的目的)。

为了避免SDL定义main函数,似乎您所需要做的就是不链接到"SDL2main"库。

引用某人的帖子,关于这个:

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

SDL2main提供了SDL_main(),它是所有SDL应用程序的全局入口点。您不需要或被迫使用它,但是它的存在是基于SDL支持的系统的多样性。Windows使用WinMain(), Linux使用main(), Android需要JNI和一些Java来实际使用SDL,所以SDL_main()使事情变得更简单。

另一方面,

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

如果您想使用SDL2,那么SDL2main和SDL2test都不是必需的,它们只是一些不错的选择。