【问题标题】:undefined reference SDL_Init with Qt未定义的引用 SDL_Init 与 Qt
【发布时间】:2014-10-17 04:18:00
【问题描述】:

我已经解决了与我类似的问题,但没有一个能解决我的问题。 所以我尝试在 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();


}

这是 .pro 文件:

#-------------------------------------------------
#
# 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 上工作,根据this article,我应该编写完整路径,但后来我遇到了访问授权问题(该死的 Windows)。 此外,将路径更改为错误的路径似乎不会让编译器感到不安。 但是,当我尝试使用时

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

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

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

【问题讨论】:

  • Hmm.. 我对 Windows 构建环境、Qt 和 SDL 都不熟悉,但这里有两个想法:如果您指定 -l&lt;libname&gt; 标志,编译器(类似 gcc类 UNIX 系统)将在库路径中查找 lib&lt;libname&gt;.ext 文件。您的 SDL.lib 与该模式不匹配。第二:.lib 是 iirc,一个静态库扩展。您是否尝试过简单地指定LIBS += SDL/lib/x86/SDL2.lib,而不使用任何-l-L 标志?
  • 我试过了,我得到“没有这样的文件或目录”。我认为标志意味着路径是相对的。而且我不能使用绝对路径,因为我遇到了授权问题。

标签: c++ qt


【解决方案1】:

当您有一个 .lib 文件时,最简单的方法是添加该文件以供链接器使用。您似乎拥有项目的子目录,但您可能正在使用单独的构建目录(正如您应该使用的那样),所以问题可能就是这样。要修复,请使用PWD qmake variable

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

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


在评论中,您提到无法使用绝对路径...不确定您的意思是什么,但出路是不使用影子构建(这没问题,只要您记得在更改构建类型时进行完全重建)。如果您使用的是 Qt Creator,您可以在 Projects 视图下找到每个构建类型的项目构建设置,并且那里有一个影子构建复选框。

【讨论】:

  • 我不确定构建主管,我不习惯 Qt,而且我很少去研究像蝙蝠一样的东西。嗯,我没碰过,所以如果默认值好,我就好了。好消息是它似乎有效!至少它编译。程序崩溃,没有输出也没有错误消息,但我不认为它来自同一个问题,除非使用错误的库会导致它。
  • 好吧,现在 Qt 快疯了。到目前为止,我一直在尝试与我一直在做的完全相同的事情,现在 Qt 没有给我任何编译器错误,它只是启动并崩溃。当我尝试在调试模式下启动时,出现错误窗口,提示“启动期间程序退出,代码为 0xc0000135”。我需要为此创建一个新主题吗?
  • This answer 可能有助于解决该错误代码:找不到某些 DLL。除了普通的 Qt DLL 之外,您还有任何额外的 DLL 吗?您确定 SDL2 库是静态库吗?如果您有 SDL2 DLL,则可以通过手动将其复制到与 exe 相同的目录来快速测试(不是正确的解决方案,只是为了测试是否缺少该 DLL)。如果是那个 DLL,那么你可以用细节扩展这个问题。如果不是,那么您可能应该问一个新问题。
猜你喜欢
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2023-03-25
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多