[Qt-interest] Compiling OpenGL/SDL application on Windows, linker problems, undefined reference to qMain(int, char**)
Benjamin Sonnemann
b.sonnemann at gmail.com
Fri Mar 20 12:26:03 CET 2009
Try this in pro file:
QT -= gui
But i dont know whether its wise what you do there. The problem with
-lSDLmain is, it redefines your main(int, char**)
to sth like SDL_main(int, char**) and places its own code in the _real_ main
to do its bootstrapping. Now Qt seems to
do sth similar ( need someone with more deeper Qt knowledge here, as i am
relative fresh into Qt). Hopefully its only
needed for gui classes, because then it should be fine.
Benjamin Sonnemann
On Fri, Mar 20, 2009 at 11:02 AM, David Rappo <david.rappo at gmail.com> wrote:
> Hi,
>
> I am trying to build an OpenGL/SDL application on Windows. I'm using
> qmake to generate my make files. The application runs fine on Linux,
> but I ran into linker problems when I tried to build on Windows. I've
> pasted my pro file below (I'm writing a Tetris clone).
>
> // Linker errors
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> In file included from
> C:/SDL/SDL_Win32_MinGW/SDL-1.2.13/include/SDL/SDL.h:28,
> from Main.cpp:5:
> C:/SDL/SDL_Win32_MinGW/SDL-1.2.13/include/SDL/SDL_main.h:50:1:
> warning: "main" redefined
> In file included from
> c:/Qt/MinGW/qt-win-opensource-src-4.5.0/include/QtGui/qwindowdefs.h:1,
> from
>
> c:/Qt/MinGW/qt-win-opensource-src-4.5.0/include/QtGui/../../src/gui/kernel/qevent.h:45,
> from
> c:/Qt/MinGW/qt-win-opensource-src-4.5.0/include/QtGui/qevent.h:1,
> from
>
> c:/Qt/MinGW/qt-win-opensource-src-4.5.0/include/QtGui/../../src/gui/accessible/qaccessible.h:52,
> from
> c:/Qt/MinGW/qt-win-opensource-src-4.5.0/include/QtGui/qaccessible.h:1,
> from
> c:/Qt/MinGW/qt-win-opensource-src-4.5.0/include/QtGui/QtGui:4,
> from
> c:/Qt/MinGW/qt-win-opensource-src-4.5.0/include/QtOpenGL/QtOpenGL:4,
> from Main.cpp:3:
>
> c:/Qt/MinGW/qt-win-opensource-src-4.5.0/include/QtGui/../../src/gui/kernel/qwindowdefs.h:147:1:
> warning: this is the location of the previous definition
> g++ -enable-stdcall-fixup -Wl,-enable-auto-import
> -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-subsystem,windows -o
> release\Tetris.exe release/Main.o
> -L"c:\Qt\MinGW\qt-win-opensource-src-4.5.0\lib" -lopengl32 -lglu32
> -lgdi32 -luser32 -lmingw32 -lqtmain
> -LC:\Users\David\Development\Aurora/Binary -lAurora_Render_Library
> -LC:\Users\David\Development\Aurora/Binary -lAurora_Math_Library
> -LC:\Users\David\Development\Aurora/Binary -lAurora_Debug_Library
> -LC:/MinGW/lib -lmingw32 -LC:\SDL\SDL_Win32_MinGW\SDL-1.2.13\lib
> -lSDLmain -LC:\SDL\SDL_Win32_MinGW\SDL-1.2.13\lib -lSDL -lQtOpenGL4
> -lQtGui4 -lQtCore4
>
> c:\Qt\MinGW\qt-win-opensource-src-4.5.0\lib/libqtmain.a(qtmain_win.o):qtmain_win.cpp:(.text+0x130):
> undefined reference to `qMain(int, char**)'
> // End linker errors
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> If the following lines are commented out:
>
> LIBS += -LC:/MinGW/lib -lmingw32
> LIBS += -L$(SDL_LIBRARY_PATH) -lSDLmain
>
> I get:
>
> // Linker errors
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> /mingw/lib/libmingw32.a(main.o):main.c:(.text+0xbd): undefined
> reference to `WinMain at 16'
> // End linker errors
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> Has anybody done this? I don't need to use QWidgets. I only need to
> use some of the classes in QtCore such as QString and QFile.
>
> I've spent some time searching the Internet, and I've found lots of
> posts about undefined references to `WinMain at 16', but nothing that
> applies to my situation.
>
> Is there any way to do what I want to do without having to install
> Cygwin or mysys?
>
> Many thanks,
>
> David
>
> ######################################################################
> # Tetris.pro
> ######################################################################
>
> TEMPLATE = app
>
> DEPENDPATH += .
>
> INCLUDEPATH += .
> INCLUDEPATH += $(LIBVECTORMATH_PATH)/scalar/cpp
> INCLUDEPATH += $(SDL_INCLUDE_PATH)
>
> CONFIG += debug_and_release
> CONFIG += build_all
>
> CONFIG(debug, debug|release) {
> win32: CONFIG += console
>
> TARGET = Tetris_Debug
> } else {
> DEFINES += QT_NO_DEBUG_OUTPUT
> DEFINES += QT_NO_WARNING_OUTPUT
> DEFINES += QT_NO_DEBUG
>
> TARGET = Tetris
> }
>
> # Not necessary on Linux
> LIBS += -LC:/MinGW/lib -lmingw32
> # Not necessary on Linux
> LIBS += -L$(SDL_LIBRARY_PATH) -lSDLmain
> # Same on Linux and Windows
> LIBS += -L$(SDL_LIBRARY_PATH) -lSDL
>
> QT += opengl
>
> ######################################################################
> # Headers
> ######################################################################
>
> #HEADERS += file.h
>
> ######################################################################
> # Sources
> ######################################################################
>
> SOURCES += Main.cpp
>
> // Main.cpp
>
> #include <QtCore>
> //#include <QtGui>
> #include <QtOpenGL>
> #include "vectormath_aos.h"
> #include "SDL.h"
>
>
> //
> --------------------------------------------------------------------------------
> // Global variables
> //
> --------------------------------------------------------------------------------
>
> const SDL_VideoInfo* g_SDL_VideoInfo = 0;
> SDL_Surface* g_SDL_Surface = 0;
> QSize g_Client_Area_Size(800, 600);
> bool g_Quit = false;
>
> //
> --------------------------------------------------------------------------------
> // Global functions
> //
> --------------------------------------------------------------------------------
>
> void Process_Events(void);
> void Display_Scene(void);
> void Setup_Render_States(void);
> void Reshape(int in_Width, int in_Height);
> bool Setup_Video(void);
>
> //
> --------------------------------------------------------------------------------
> // main
> //
> --------------------------------------------------------------------------------
>
> int main(int argc, char *argv[])
> {
> AURORA_DEBUG_METHOD_SCOPE;
>
> QApplication l_Application(argc, argv);
>
> if ( SDL_Init(SDL_INIT_VIDEO) == -1 )
> {
> //QMessageBox::warning(0, "SDL", "SDL_Init returned -1");
> SDL_Quit();
> return 1;
> }
>
> if (!Setup_Video())
> {
> //QMessageBox::warning(0, "SDL", "Setup_Video returned
> false");
> SDL_Quit();
> return 1;
> }
>
> Setup_Render_States();
>
> qDebug() << "Entering main game loop\n";
>
> while (g_Quit == false)
> {
> Process_Events();
> Display_Scene();
> }
>
> SDL_Quit();
>
> return 0;
> }
>
> void Process_Events(void)
> {
> SDL_Event l_SDL_Event;
>
> while ( SDL_PollEvent(& l_SDL_Event) )
> {
> switch (l_SDL_Event.type)
> {
> case SDL_VIDEORESIZE:
> {
> qDebug() << "SDL_VIDEORESIZE" << "\n";
> qDebug() << "l_SDL_Event.resize.w == " <<
> l_SDL_Event.resize.w << "\n";
> qDebug() << "l_SDL_Event.resize.h == " <<
> l_SDL_Event.resize.h << "\n";
>
> Reshape( l_SDL_Event.resize.w,
> l_SDL_Event.resize.h );
> }
> break;
> case SDL_KEYDOWN:
> {
> if (l_SDL_Event.key.keysym.sym ==
> SDLK_SPACE)
> {
> qDebug() << "Space key pressed!\n";
> }
>
> if (l_SDL_Event.key.keysym.sym ==
> SDLK_ESCAPE)
> {
> qDebug() << "Escape key pressed!\n";
> g_Quit = true;
> }
> }
> break;
> case SDL_KEYUP:
> {
> if (l_SDL_Event.key.keysym.sym ==
> SDLK_SPACE)
> {
> qDebug() << "Space key released!\n";
> }
>
> if (l_SDL_Event.key.keysym.sym ==
> SDLK_ESCAPE)
> {
> qDebug() << "Escape key
> released!\n";
> }
> }
> break;
>
> case SDL_MOUSEBUTTONDOWN:
> {
> Uint8 l_Mouse_Button =
> l_SDL_Event.button.button;
> QString l_Mouse_Button_String = (
> (l_Mouse_Button ==
> SDL_BUTTON_LEFT) ? "SDL_BUTTON_LEFT" : "SDL_BUTTON_RIGHT" );
> qDebug() << "SDL_MOUSEBUTTONDOWN: " <<
> l_Mouse_Button_String << "\n";
> }
> break;
>
> case SDL_MOUSEBUTTONUP:
> {
> Uint8 l_Mouse_Button =
> l_SDL_Event.button.button;
> QString l_Mouse_Button_String = (
> (l_Mouse_Button ==
> SDL_BUTTON_LEFT) ? "SDL_BUTTON_LEFT" : "SDL_BUTTON_RIGHT" );
> qDebug() << "SDL_MOUSEBUTTONUP: " <<
> l_Mouse_Button_String << "\n";
> }
> break;
>
> case SDL_QUIT:
> {
> qDebug() << "SDL_QUIT" << "\n";
> g_Quit = true;
> }
> break;
> }
> }
> }
>
> void Display_Scene(void)
> {
> glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
>
> glLoadIdentity();
>
> SDL_GL_SwapBuffers();
> }
>
> void Setup_Render_States(void)
> {
> GLfloat l_Red = 1.0;
> GLfloat l_Green = 1.0;
> GLfloat l_Blue = 1.0;
> GLfloat l_Alpha = 0.0f;
>
> glClearColor(l_Red, l_Green, l_Blue, l_Alpha);
>
> glEnable(GL_DEPTH_TEST);
> glShadeModel(GL_SMOOTH);
>
> glPolygonMode(GL_FRONT, GL_LINE);
> glPolygonMode(GL_BACK, GL_LINE);
>
> glEnable(GL_CULL_FACE);
> glCullFace(GL_BACK);
> }
>
> void Reshape(int in_Width, int in_Height)
> {
> g_Client_Area_Size.setWidth(in_Width);
> g_Client_Area_Size.setHeight(in_Height);
>
> if (!Setup_Video())
> {
> SDL_Quit();
> g_Quit = true;
> return;
> }
>
> glViewport (0, 0, (GLsizei) g_Client_Area_Size.width(), (GLsizei)
> g_Client_Area_Size.height());
> glMatrixMode(GL_PROJECTION);
> glLoadIdentity();
> gluOrtho2D(0.0, g_Client_Area_Size.width(), 0.0,
> g_Client_Area_Size.height());
> glMatrixMode(GL_MODELVIEW);
> }
>
> bool Setup_Video(void)
> {
> g_SDL_VideoInfo = SDL_GetVideoInfo();
> if (g_SDL_VideoInfo == 0)
> {
> return false;
> }
>
> SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
> SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
> SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
> SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
> SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
>
> g_SDL_Surface = SDL_SetVideoMode(g_Client_Area_Size.width(),
> g_Client_Area_Size.height(), g_SDL_VideoInfo->vfmt->BitsPerPixel,
> SDL_OPENGL|SDL_RESIZABLE);
> if (g_SDL_Surface == 0)
> {
> return false;
> }
>
> return true;
> }
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20090320/25dd379a/attachment.html
More information about the Qt-interest-old
mailing list