【问题标题】:SDL2 undefined reference sdl_Main in QtCreatorQtCreator 中的 SDL2 未定义引用 sdl_Main
【发布时间】:2014-07-13 18:43:34
【问题描述】:

我正在尝试使用 QtCreator 创建一个包含 SDL2 的项目。但是 SDL 无法正确编译,我看不到错误。

我的 QtCreator .pro 文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Psiora
TEMPLATE = app

SOURCES += main.cpp\
        ui_mainwindow.cpp

HEADERS  += ui_mainwindow.h

FORMS    += ui_mainwindow.ui

INCLUDEPATH += "D:\devel\SDL2-2.0.3\i686-w64-mingw32\include\SDL2"

LIBS += -L"D:\devel\SDL2-2.0.3\i686-w64-mingw32\lib" \
        -lmingw32 \
        -mwindows \
        -lSDL2main \
        -lSDL2

Main.cpp

#include "ui_mainwindow.h"
#include <QApplication>

#define SDL_MAIN_HANDLED //Let QT Supply WinMain
#include "SDL.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    UI_mainWindow win;
    win.show();

    return app.exec();
}

编译器错误

g++ -Wl,-subsystem,windows -mthreads -o 调试\Psiora.exe 调试/main.o 调试/ui_mainwindow.o 调试/moc_ui_mainwindow.o -lglu32 -lopengl32 -lgdi32 -luser32 -lqtmaind -LD:\devel \SDL2-2.0.3\i686-w64-mingw32\lib -lmingw32 -mwindows -lSDL2main -lSDL2 -LD:\devel\Qt\5.2.1\mingw48_32\lib -lQt5Widgetsd -lQt5Guid -lQt5Cored

D:\devel\SDL2-2.0.3\i686-w64-mingw32\lib/libSDL2main.a(SDL_windows_main.o):在函数“console_main”中:

/Users/slouken/release/SDL/SDL2-2.0.3-source/foo-x86/../src/main/windows/SDL_windows_main.c:140:未定义对“SDL_main”的引用 collect2.exe:错误:ld 返回 1 个退出状态

我不明白为什么当 SDL 以正确的顺序链接时,它会给出对 sdl_Main 的未定义引用。当没有这样的路径时,我也不知道“/Users/slouken/release/SDL/SDL2-2.0.3-source/foo-x86/../src/main/windows/”是从哪里来的我的电脑,也没有自己添加路径。

我的理解是 SDL_Main 提供了 WinMain,但是我希望使用 Qt 提供的 WinMain,所以我定义了 SDL_MAIN_HANDLED 定义以使用 SDL_Main 停止 SDL。

补充资料:

  • 操作系统:Windows 8.1 Pro 32bit
  • 编译器:MinGW 4.8 - Qt 安装程序提供的默认版本
  • Qt:5.2.1
  • SDL 2.0.3 - 直接从 libsdl.org 下载,未经修改,没有补丁。

【问题讨论】:

  • 你能告诉我们你为什么要混合使用 SDL 和 Qt 吗?
  • 我用SDL写了一个完整的模拟器,使用了SDL的2D跨平台渲染、时序和声音特性。现在我正在尝试添加一个界面和对话框窗口,目的是将 SDL 视频输出重定向到 QWidget,让我保留所有原始代码。
  • 如果我从 .pro 和 main.cpp 文件中完全删除 QT 的所有痕迹。它编译和链接很好。
  • 行“#include ”有所不同。取消注释可以让它编译得很好。也许这与试图提供 WinMain 的 QT 和 SDL 有关?
  • 是的,Qt 会将其扩展为 qMain,而 WinMain 将找不到它。

标签: c++ qt sdl qt-creator qmake


【解决方案1】:

将此添加到您的项目文件以解决此问题:

win32:QMAKE_LIBS_QT_ENGTRY -= -lqtmain
win32-g++:DEFINES -= QT_NEEDS_QMAIN

CONFIG-= windows
QMAKE_LFLAGS += $$QMAKE_LFLAGS_WINDOWS

【讨论】:

  • 这解决了我的问题。我是否认为这消除了对 qtmain 的需要,允许 SDL 处理 WinMain 转换?
  • @Scott:是的,debao 好像已经解释过了in here
  • 谢谢,该链接提供的信息非常丰富,并且很好地解释了问题。
  • 如何在没有 Qt 项目 (.pro) 文件的情况下使用这些选项?即使用 CMakeLists.txt 项目
猜你喜欢
  • 2012-06-03
  • 2011-06-21
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2014-03-30
  • 1970-01-01
相关资源
最近更新 更多