在QtCreator中链接SDL2

3

我希望将Qt作为我的SDL应用程序的编辑器。当我尝试在Qt中创建一个空白项目并链接库时,它无法找到SDL2/SDL.h。以下是我的.pro文件中的内容:

mac: LIBS += "-F$$PWD/../Control Libraries/" -framework SDL2
INCLUDEPATH += "$$PWD/../Control Libraries/SDL2.framework/Versions/A/Headers"


mac: LIBS += "-F$$PWD/../Control Libraries/" -framework SDL2_mixer
INCLUDEPATH += "$$PWD/../Control Libraries/SDL2_mixer.framework/Versions/A/Headers"


mac: LIBS += "-F$$PWD/../Control Libraries/" -framework SDL2_ttf
INCLUDEPATH += "$$PWD/../Control Libraries/SDL2_ttf.framework/Versions/A/Headers"

我找不到任何人发布如何使其工作的信息,但我知道一定有方法。在Xcode中只需单击即可运行,所以我是不是做错了什么?谢谢。
编辑:
这里是错误消息:
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -c -pipe -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -mmacosx-version-min=10.6 -Wall -W -fPIE -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../../Qt/5.3/clang_64/mkspecs/macx-clang -I../SpudEngineEditor -I../Control\ Libraries/SDL2.framework/Headers -I../Control\ Libraries/SDL2_mixer.framework/Headers -I../Control\ Libraries/SDL2_ttf.framework/Headers -I../../../Qt/5.3/clang_64/lib/QtWidgets.framework/Versions/5/Headers -I../../../Qt/5.3/clang_64/lib/QtGui.framework/Versions/5/Headers -I../../../Qt/5.3/clang_64/lib/QtCore.framework/Versions/5/Headers -I. -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/AGL.framework/Headers -I. -I. -F/Users/Logan/Qt/5.3/clang_64/lib -o Camera.o ../SpudEngineEditor/Camera.cpp
In file included from ../SpudEngineEditor/Camera.cpp:9:
In file included from ../SpudEngineEditor/Camera.h:13:
../SpudEngineEditor/CoreEngine.h:14:9: warning: unknown pragma ignored [-Wunknown-pragmas]
#pragma comment (lib, "glu32.lib")
        ^
In file included from ../SpudEngineEditor/Camera.cpp:9:
In file included from ../SpudEngineEditor/Camera.h:13:
In file included from ../SpudEngineEditor/CoreEngine.h:34:
../Control Libraries/SDL2_ttf.framework/Headers/SDL_ttf.h:30:10: fatal error: 'SDL2/SDL.h' file not found
#include <SDL2/SDL.h>

编辑:我已经解决了可以包含“<”但不能包含“>”的问题,这是一个问题,因为SDL mixer和SDL rtf都使用了“</”。


一些澄清:Qt Creator 只是一个集成开发环境(IDE)。它通常与 Qt SDK 一起安装,并且最常用于开发 Qt 应用程序。但它仍然是与 Qt(SDK 或库)分开的东西。 - hyde
@hyde 我计划在这个项目中使用QT SDK,我只需要先弄清楚如何链接库。 - BlueSpud
在这样的问题中,通常最好显示精确的编译失败命令(在Qt Creator的编译输出视图中查找)。如果我的答案不能解决这个问题,那么您可以将其添加到问题中。 - hyde
你能看到编译命令吗?对于gcc,它应该是gcc ... -I ... -c ... main.cpp,对于clang也大概是类似的。 - hyde
@hyde 更新了问题并包含了相关信息。 - BlueSpud
编辑了我的答案,如果那不解决问题(并且您确定在.pro文件中记得放置所有需要的""),则下一步是打开Qt命令提示符(无论您在Mac上如何执行此操作,以便您可以在PATH中找到编译器),转到运行该命令的目录(它应该在编译输出中可见)。然后,您可以尝试手动复制粘贴命令,并验证命令中的所有相对路径是否正确等。 - hyde
2个回答

4

当路径中包含空格时,应使用双引号,例如:

INCLUDEPATH += "$$PWD/../Control Libraries/SDL2.framework/Versions/A/Headers"

除非您确实希望它们作为单独的参数传递,否则可以这样写:
mac: LIBS += "-F$$PWD/../Control Libraries/" -framework SDL2_mixer

问题编辑后:你有一个#include <SDL2/SDl.h>。看起来大小写有误,应该是 #include <SDL2/SDL.h>
#include <SDL2/SDL.h>

似乎没有起作用,我已经在问题中包含了完整的错误信息。 - BlueSpud
这让我可以包含<SDL.h>而不是<SDL2/SDL.h>,这是一个问题,因为SDL mixer和SDL ttf都尝试使用SDL2/SDL.h。我已经更新了问题以反映新的更改。 - BlueSpud
@BlueSpud 那个 SDL.h 的完整绝对路径是什么? - hyde
1
@BlueSpud 我知道我晚了2年,但以防这对某人有用:原因是头文件直接包含在框架目录中的 Headers 中。您可以手动在 Headers 中创建一个 SDL2 目录,并将所有 .h 文件移动到其中... 看起来不是很理想,但肯定有效。 - user21037

1
编译器清楚地指出了错误:

../SpudEngineEditor/main.cpp:3:10: 致命错误: 找不到 'SDL2/SDl.h' 文件

你需要做的是替换这一行代码:
#include <SDL2/SDl.h>

使用:

#include <SDL2/SDL.h>
//               ^, yes uppercase.

此外,对于路径中含有空格的情况,您应该使用专门为此目的建立的相应的引用 qmake 函数,这将在内部双引号中也起作用。在所有情况下,双引号也可能有效,但如果已经建立了花哨的函数,我个人更喜欢使用它。 :-)
如果我是您,我还会建立一个辅助变量,以免重复多次相同的路径。
此外,我会编写一个 qmake 函数,尽管在内联调用中这并非必要,但它可以使用真正的 qmake 功能,即 for 循环,因为您正在重复相同的操作。因此,我会编写如下内容:
setSDLPaths() {
    CONTROL_LIBRARIES_PATH = $$quote($$PWD/../Control Libraries/)
    LIST = SDL2 SDL2_ttf SDL2_mixer
    for(item, LIST) {
        mac: LIBS += -F$$CONTROL_LIBRARIES_PATH -framework $$item
        INCLUDEPATH += $$CONTROL_LIBRARIES_PATH/$${item}.framework/Versions/A/Headers
    }
}

这将大大简化您的代码,基本上只需要一行代码:
$$setSDLPaths()

我应该把这个函数放在哪里?仅仅改变名称并没有起作用,将其放在.pro文件中也没有起作用。 - BlueSpud
@BlueSpud: 不起作用 不起作用。 - László Papp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接