1

我和我的朋友正在将我们的软件移植到 Mac OSX。该应用程序大量构建在 SDL 之上,我们很难在 Qt5 中链接和编译 SDL。我们没有在我们的代码中使用 Qt 的任何部分,而是使用 IDE 来简化跨平台。

目前,我里面有 SDL 框架/Library/Frameworks/

在 application.pro 里面我有:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

macx {
   INCLUDEPATH += "/Library/Frameworks/SDL.framework/headers/"
}

main.cpp我显然有#include "SDL.h"并且如果我 ctrl 单击SDL.h它表明它正在链接到框架......

当我去构建/编译我得到这个错误:

14:21:24: Running steps for project BDGame...
14:21:24: Configuration unchanged, skipping qmake step.
14:21:24: Starting: "/usr/bin/make" -w
make: Entering directory `/Users/Kite/Dropbox/Wizardry Games/BDGame/BDGame-build-Desktop_Qt_5_0_0_clang_64bit_SDK-Release'
g++ -headerpad_max_install_names -mmacosx-version-min=10.6 -o BDGame main.o    
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
     (maybe you meant: _SDL_main)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [BDGame] Error 1
make: Leaving directory `/Users/Kite/Dropbox/Wizardry Games/BDGame/BDGame-build-Desktop_Qt_5_0_0_clang_64bit_SDK-Release'
14:21:24: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project BDGame (kit: Desktop Qt 5.0.0 clang 64bit (SDK))
When executing step 'Make'

在此处输入图像描述

我做错了什么阻止 Qt 使用 SDL?

4

1 回答 1

3

在您的main.cpp文件中,您必须声明int SDL_main(int, char**)function 而不是main(). 您还需要获取SDLMain.hSDLMain.mOS X 的 SDL 捆绑包一起分发的文件。这两个是引导您的 Cocoa 应用程序所必需的,该应用程序将进一步调用该SDL_main函数。

我想您使用 Qt 项目 (*.pro) 文件。你应该有这样的东西:

qtsdl.pro

QT -= 核心 gui

目标 = qtsdl
配置 += 控制台
配置 -= app_bundle

模板 = 应用程序

INCLUDEPATH += /Library/Frameworks/SDL.framework/Headers
LIBS += -framework Cocoa -framework SDL

来源 += \
    主文件

OBJECTIVE_SOURCES += \
    SDLMain.m

标题 += \
    SDLMain.h

主文件

#include <SDL.h>

int SDL_main(int argc, char *argv[])
{
    (void)argc;
    (void)argv;

    SDL_Surface *screen;

    if (SDL_Init(SDL_INIT_VIDEO) < 0)
        return 1;

    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_HWSURFACE);
    if (!screen) {
        SDL_Quit();
        return 1;
    }

    SDL_Event event;
    bool running = true;

    while (running) {
        while (SDL_PollEvent(&event)) {
            switch (event.type) {
            case SDL_QUIT:
                running = false;
                break;
            case SDL_KEYDOWN:
                running = false;
                break;
            default:
                break;
            }
        }
    }

    SDL_Quit();
    return 0;
}

SDLMain.hSDLMain.m从 SDL 框架分发中获取它们。

于 2012-12-26T22:53:18.240 回答