【问题标题】:SFML 2.1 program runs fine in debug mode, but crashes in release modeSFML 2.1 程序在调试模式下运行良好,但在发布模式下崩溃
【发布时间】:2013-10-06 21:42:29
【问题描述】:

我正在将 Qt Creator 用于 SFML 项目。我目前遇到的问题是我的应用程序会在某行代码上崩溃只有在我在发布模式下运行时。

我已经精简了我的应用程序以找到导致问题的确切代码行。这是我的整个程序的样子:

在调试模式下工作;发布模式下崩溃

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Worked!");
    window.setVerticalSyncEnabled(true);

    sf::Shader shader;
    shader.loadFromFile("data\\shaders\\HorizontalBlur.frag", sf::Shader::Fragment);

    return 0;
}

如果我删除 loadFromFile 代码,那么它将在调试和发布模式下运行良好。

在调试模式下工作;在发布模式下工作

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Worked!");
    window.setVerticalSyncEnabled(true);

    sf::Shader shader;
    //shader.loadFromFile("data\\shaders\\HorizontalBlur.frag", sf::Shader::Fragment);

    return 0;
}

我的系统如下所示:

  • Windows 8 64 位
  • Qt Creator 2.8.1
  • GCC 4.8
  • SFML 2.1 使用 GCC 4.8 编译

我正在寻找您的建议和指导,以帮助我弄清楚是什么导致这行代码在调试模式下工作,而不是在发布模式下工作。

谢谢! :)

更新 #1

我正在为这个项目使用 qmake。它创建了三个 make 文件:

  • 生成文件
  • Makefile.debug
  • Makefile.release

我对 makefile 不是很有经验,但我可以看到一些有关在调试和发布 make 文件中链接的库的信息。

Makefile.debug

LIBS        =        C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-main-d.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-graphics-d.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-window-d.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-system-d.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-audio-d.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-network-d.a 

Makefile.release

LIBS        =        C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-main.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-graphics.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-window.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-system.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-audio.a C:/Users/Derek/Documents/Development/Projects/Dots-A-Lot/dependencies/SFML-2.1-windows-gcc-4.8-mingw-32bits/lib/libsfml-network.a 

我还在调试输出文件夹(在调试可执行文件旁边)中有调试 DLL,在发布输出文件夹(在发布可执行文件旁边)有发布 DLL。数据文件夹同时位于调试和发布文件夹中,因此它可以访问片段着色器文件。

【问题讨论】:

  • 程序运行的文件夹是什么?如果您的程序在可执行文件夹中运行,并且着色器在调试模式下存在,但不在发布模式下,那就可以解释您的问题。
  • @luiscubal 我认为这也可能是问题所在。我在可执行文件的正确位置有数据文件夹和发布 DLL。我什至可以进入该文件夹并运行发布可执行文件,但它仍然会崩溃。当我从它的位置(带有数据文件夹和调试 DLLS)运行调试可执行文件时,它将正常运行。
  • 您链接的版本是否正确?调试版本的调试库和 DLL,发布版本的发布库和 DLL。
  • @luiscubal 我花了一点时间查看了我的 qmake .pro 文件以及生成的 makefile。我认为事情链接正确,但是有没有办法可以验证构建期间链接的内容?我已经用有关 makefile 的更多信息更新了我的问题。谢谢! :)
  • 我注意到您没有创建窗口/上下文。这有帮助吗?我的意思是,也许着色器没有在发布模式下正确创建 OpenGL 上下文?

标签: c++ qt-creator sfml


【解决方案1】:

我能够解决我的问题。我已按照以下说明构建 SFML:

http://sfml-dev.org/tutorials/2.1/compile-with-cmake.php

我已经用 mingw 下载了 g++ 4.8.1 并用它来编译 SFML。但是,当我使用该构建生成的 .a/.dll 文件时,我的发布构建会在该代码行上崩溃。

今天 (10-7-2013) 我找到了这些说明:

https://github.com/LaurentGomila/SFML/wiki/Tutorial%3A-Compile-and-Link-SFML-with-Qt-Creator#step-10

我浏览了这些说明并使用了 Qt Creator 附带的 g++ 4.8.0 编译器(而不是我下载的那个)。现在我可以在发布模式下运行而不会崩溃。

我没有意识到我使用一个版本的编译器来构建 SFML (g++ 4.8.1) 和另一个版本来构建我的应用程序 (g++ 4.8.0)。

谢谢你,luiscubal,你问我有关链接器的问题,为我指明了正确的方向。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    相关资源
    最近更新 更多