使用mingw编译SDL工程时出现WinMain@16错误

使用SDL进行跨平台的物理仿真(可以在Windows/Linux/Mac上编译),发现在使用mingw编译时出现如下错误:

mkdir -p obj/Source/ output
g++ -DSDL_BUILD -DWINDOWS_BUILD -ISource -I/usr/local/include obj/Source/game.c.o obj/Source/WindowsTime.c.o obj/Source/GLGraphics.c.o obj/Source/SDLMain.c.o obj/Source/BallData.c.o -o output/PhysicsTest -I/usr/local/include -L/usr/local/lib -lSDL -lSDLmain -lopengl32 -lglu32-lwinmm
c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../libmingw32.a(main.o):main.c:(.text+0xd2):对‘WinMain@16’未定义的引用
collect2: ld returned 1 exit status
make: *** [output/PhysicsTest] Error 1

 网上类似的错误也有很多:

undefined reference to `WinMain@16'
collect2: ld returned 1 exit status 

解释是,找不到main或者WinMain函数。

 

那就非常诡异了,我不是已经链接了libSDLmain.a了吗?

用nm查看一下:

$ nm /usr/local/lib/libSDLmain.a

SDL_win32_main.o:
00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 N .stab
00000000 N .stabstr
00000000 t .text
U _FreeLibrary@4
U _GetCommandLineA@0
U _GetModuleFileNameA@12
U _GetModuleHandleA@4
U _LoadLibraryA@4
000001f0 t _OutOfMemory
00000000 t _ParseCommandLine
U _SDL_GetError
U _SDL_Init
U _SDL_Quit
U _SDL_SetModuleHandle
U _SDL_getenv
U _SDL_main
U _SDL_strlcat
U _SDL_strlcpy
000001c0 t _ShowError
00000640 T _WinMain@16
U __imp____mb_cur_max
U __imp___iob
U __imp___pctype
U __isctype
U _atexit
U _atoi
00000210 t _cleanup
00000220 t _cleanup_output
00000510 T _console_main
U _exit
U _fclose
U _fgetc
U _fopen
U _fprintf
U _freopen
U _malloc
00000300 t _redirect_output
U _remove
U _setbuf
U _setvbuf
00000120 b _stderrPath
00000000 b _stdioRedirectEnabled
00000010 b _stdoutPath
U _strlen
U _strrchr

00000640 T _WinMain@16,这个符号难道不是WinMain@16?

 

查看使用了main函数的文件,即

 

$ nm obj/Source/SDLMain.c.o
00000000 b .bss
00000000 d .data
00000000 i .drectve
00000000 r .rdata
00000000 t .text
U _AddFrame
00000004 C _Buffer
00000004 C _CloseButtonPressed
U _Game_Draw
U _Game_Exit
U _Game_Initialize
U _Game_Work
U _GetFrames
U _GetTimeNow
00000004 C _MouseWheel
00000008 C _Orientation
0000011e T _PollEvents
U _SDL_FreeSurface
U _SDL_GL_SetAttribute
U _SDL_GL_SwapBuffers
U _SDL_GetMouseState
U _SDL_GetVideoInfo
U _SDL_Init
U _SDL_PollEvent
U _SDL_Quit
U _SDL_SetVideoMode
U _SDL_WM_SetCaption
00000256 T _SDL_main
00000004 C _ScreenHeight
00000004 C _ScreenScalar
00000004 C _ScreenWidth
U _SetFramesPerSecond
U _SubtractTime
000000d8 T _TouchChanged
000000ea T _TouchIsDown
000000ff T _TouchIsUp
00000004 C _TouchOldValue
00000008 C _TouchPos
00000004 C _TouchValue
00000114 T _Touching
00000000 T _Update_Input
00000004 C _WorkTime
U _cos
U _sin

 

_SDL_main这个符号是从何而来?

细心一想,发现最可疑的是,SDL的头文件把main函数宏定义了,导致源文件编译时不是main函数,而是被宏定义为SDL_main。加上

 

#undef main
int main( int argc, char* argv[] ) {

 

编译成功,此时再查看符号,发现_main出现了。

$ nm obj/Source/SDLMain.c.o
00000000 b .bss
00000000 d .data
00000000 i .drectve
00000000 r .rdata
00000000 t .text
U _AddFrame
00000004 C _Buffer
00000004 C _CloseButtonPressed
U _Game_Draw
U _Game_Exit
U _Game_Initialize
U _Game_Work
U _GetFrames
U _GetTimeNow
00000004 C _MouseWheel
00000008 C _Orientation
0000011e T _PollEvents
U _SDL_FreeSurface
U _SDL_GL_SetAttribute
U _SDL_GL_SwapBuffers
U _SDL_GetMouseState
U _SDL_GetVideoInfo
U _SDL_Init
U _SDL_PollEvent
U _SDL_Quit
U _SDL_SetVideoMode
U _SDL_WM_SetCaption
00000004 C _ScreenHeight
00000004 C _ScreenScalar
00000004 C _ScreenWidth
U _SetFramesPerSecond
U _SubtractTime
000000d8 T _TouchChanged
000000ea T _TouchIsDown
000000ff T _TouchIsUp
00000004 C _TouchOldValue
00000008 C _TouchPos
00000004 C _TouchValue
00000114 T _Touching
00000000 T _Update_Input
00000004 C _WorkTime
U ___main
U _cos
00000256 T _main
U _sin

 

一定要#undef main才可以吗?

为什么官方给的libSDLmain.a里的_WinMain@16不是WinMain@16呢?

时间: 2024-11-01 23:50:46

使用mingw编译SDL工程时出现WinMain@16错误的相关文章

qt mysql-Qt编译MySql驱动时missing separator的错误

问题描述 Qt编译MySql驱动时missing separator的错误 大家好,我最近在用Qt编译Mysql驱动的时候遇到了问题 步骤是按照网上的教程来的 但是报了Makefile.debug 62 :missing separator的错误 有人说是路径的问题,但是我不知道是指的什么路径 以下是我的pro文件 TARGET = qsqlmysql INCLUDEPATH += "C:mysqlinclude" LIBS += "C:mysqlliblibmysql.li

mingw-MinGw编译GMP库时出错,跪求大神解答

问题描述 MinGw编译GMP库时出错,跪求大神解答 Config.log如下: This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by GNU MP configure 6.1.0, which was generated by GNU Autoconf 2.69.

请教大神:spark1.6.2编译到core时出错

问题描述 下载了spark1.6.2版本,安装hadoop2.6,按照build/mvn-Pyarn-Phadoop-2.6-Pspark-ganglia-lgpl-Pkinesis-asl-Phive-DskipTestscleanpackage进行编译,在编译到spark-core时,提示如下错误:[INFO][INFO]---maven-remote-resources-plugin:1.5:process(default)@spark-core_2.10---[WARNING]Inval

mingw-主工程是MSVC2010编译的,使用MinGW编译的库却会报错?

问题描述 主工程是MSVC2010编译的,使用MinGW编译的库却会报错? 我用Qt_4_8_0_for_Desktop_-_MinGW编译了一个动态库:qextserialportd.dll, 然后我的主工程使用qextserialportd.dll: pro文件中LIBS += ../LeadEDM/SerialPort/qextserialportd.dll,并把qextserialportd.dll和相应头文件都放入工程目录中 再然后使用Qt_4_8_0_for_Desktop_-_MS

在SDL工程中让SDL_ttf渲染汉字

有时候在关于SDL的博文中看到一些评论,说SDL对中文的支持不佳,因为当程序涉及中文时总是输出乱码.   照我个人观点,这里面很多都是误解.下面就根据我在windows下使用SDL的情况,说说我的观点.   SDL作为一个跨平台的库,在字符方面有它独特的地方.那就是,它的运行库支持的字符编码为UTF8,而不是windows中常见的各种本地字符编码.比如中文版windows使用的codepage 936,也有称其为GBK的,实际上是对基于GB2312字符集的EUC-CN编码方式做了一个基于UNIC

程序编译后运行时的内存分配

太好的文章了,看到不得不转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1.编译时不分配内存编译时是不分配内存的.此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确.所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误. 2.运行时必分配内存运行时程序是必须调到"内存"的.因为CPU(其中有多个寄存器)只与内存打交道的.程序在进入实际内存之前要首先分配物理内存. 3.

cmake-刚刚接触Cmake,Cmake构建VTK工程时出错求大神解答。

问题描述 刚刚接触Cmake,Cmake构建VTK工程时出错求大神解答. Cmake编译时出错: CMake Error at CMakeLists.txt:11 (target_link_libraries): Cannot specify link libraries for target "TestVTKInstallvtkRendering" which is not built by this project. CMakeLists.txt的内容是: cmake_minimu

关于gcc和g++编译c文件时的一点疑惑

问题描述 关于gcc和g++编译c文件时的一点疑惑 普遍观点,gcc把c文件当做c处理,把c++当做c++处理:而g++把二者都当做c++处理.这里的处理是指语法分析那一步. 但g++在编译过程中调用了gcc.我疑惑了,语法分析是编译的第二步吧,既然g++调用了gcc,那么它是怎么让gcc把c文件当做c++处理的. 还有一点,就是对于c文件编译出来的符号,使用gcc和g++到底一不一样.比如在c文件里定义int add(int a,int b):用gcc和g++最后编译出来的符号到底是什么?是c

java-求教怎么用mingw编译出64bit的dll

问题描述 求教怎么用mingw编译出64bit的dll 今天折腾了一天的JNI 了,我的机器是win7 64bit的,jvm也是64bit的,没有VS,所以用MinGW把C编译成dll,经过今天的折腾还是没能编译出64bit的dll 编译时所用的命令是: gcc -Wall -D __int64="long long" -Wl,--kill-at -ID:/Java/jdk1.7.0_67/include -ID:/Java/jdk1.7.0_67/include/win32 -sha