未定义的引用SDL_Init与Qt

undefined reference SDL_Init with Qt

本文关键字:Init Qt SDL 引用 未定义      更新时间:2023-10-16

我已经经历了类似的问题,但没有一个能解决我的问题。因此,我试图在Qt Widget中使用SDL(出于教育目的),并且我总是在我调用的每个SDL函数上获得未定义的引用。

以下是我一直用于测试的(极简主义)代码:

#include "mainview.h"
#include <QApplication>
#include "SDL.h"
#undef main

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainView w;
    w.show();
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window* window = SDL_CreateWindowFrom((void*)w.centralWidget->winId());
    SDL_Renderer* render = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
    SDL_SetRenderDrawColor(render, 255, 0, 0, 255);
    SDL_RenderFillRect(render, NULL);
    SDL_RenderPresent(render);
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(render);
    SDL_Quit();
    return a.exec();

}

这是专业文件:

#-------------------------------------------------
#
# Project created by QtCreator 2014-10-08T22:37:55
#
#-------------------------------------------------
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MapEditor
TEMPLATE = app

SOURCES += main.cpp
        mainview.cpp
HEADERS  += mainview.h
FORMS    += mainview.ui
INCLUDEPATH += SDL/include/
LIBS += -L SDL/lib/x86/SDL2.lib

根据我读到的其他答案,问题似乎来自图书馆的链接。我以前从未真正使用过这个文件或其他qmake,所以我不确定我使用的路径。我在windows上工作,根据这篇文章,我应该写完整的路径,但后来我遇到了访问授权问题(该死的windows)。此外,将路径更改为false似乎不会让编译器感到不安。然而,当我尝试使用时

LIBS += -L SDL/lib/x86/ -lSDL2.lib

编译器找不到该文件。我使用的编译器是一个32位的MinGW,所以我已经在lbsdb.org上下载了相应的文件,并且我尝试了所有子文件夹上的库(x86_64,i686,…),但都不起作用。

很抱歉,如果我的写作方式很奇怪,我是法国人。

当您有一个.lib文件时,最简单的方法是为链接器添加文件。您的项目似乎有它的子目录,但您可能使用了一个单独的构建目录(正如您应该使用的),所以问题可能是这样的。要修复,请使用PWDqmake变量:

LIBS += $${PWD}/SDL/lib/x86/SDL2.lib

您可能还想添加PWD以包含路径,因为那里的相对路径是相对于.c文件的目录的,并且您可能并不总是将它们都放在同一目录中。


在一条评论中,你提到了一些关于不能使用绝对路径的事情。。。不知道你的意思是什么,但一个解决办法是不使用影子构建(这没问题,只要你记得在更改构建类型时进行完全重建)。如果您使用的是Qt Creator,您可以在Projects视图下找到每个构建类型的项目构建设置,并且有一个阴影构建复选框。