我在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
答案 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,它们只是一些不错的选择。