-1

正如标题所说,我已经在 Linux Mint 14 上成功编译、链接并运行了一个用 sfml-1.6 制作的程序。我使用 g++ 进行编译。但是,一旦我将源文件移动到 Windows 并尝试编译为 sfml 库的 Windows 等效项,它就会崩溃。该程序可以正常编译和链接,但在到达 main 之前就崩溃了。我确保我自己的 .h 文件中没有任何全局对象/变量。但我不能为 sfml 库做到这一点。我怀疑可能是因为库坏了,所以我移植了 sfml 2.0 的代码,问题仍然存在。关于我做错了什么的任何线索?我还确保我不使用任何特定于平台的标头。

这是我的 main.cpp

#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "World.h"
#include <sstream>
#include <vector>
#include <zip.h>

enum states
{
    MENU,
    GAME,
    PAUSE,
    EXIT,
    DIE
};
player plr;
sf::Clock timer;
void getKeys(const sf::Input& input);
std::string floatToString(float flt);

int main(int argc, char** argv) 
{
    sf::RenderWindow window(sf::VideoMode(1024, 768), "sfTest");
    window.SetFramerateLimit(60);
    sf::Music startSong;
    sf::Music endSong;
    sf::Music s1, s2, s3;
    sf::String musicBy;
    musicBy.SetText("Music by Kevin McLeod: www.incompetech.com");
    if(!s1.OpenFromFile("Batty McFaddin.ogg"))
        return -1;
    if(!s2.OpenFromFile("Merry Go.ogg"))
        return -1;
    if(!s3.OpenFromFile("One-eyed Maestro.ogg"))
        return -1;
    if(!endSong.OpenFromFile("One-eyed Maestro.ogg"))
        return -10;


    if(!startSong.OpenFromFile("Comedic Juggernaut.ogg"))
        return -15;

    endSong.SetVolume(50);

    std::vector<sf::Music*> playList;
    std::vector<sf::Music*>::iterator mIt;
    s1.SetVolume(25);
    s2.SetVolume(25);
    s3.SetVolume(25);
    playList.push_back(&s2);
    playList.push_back(&s3);
    playList.push_back(&s1);    

    startSong.SetLoop(true);
    startSong.SetVolume(50);
    const sf::Input& input = window.GetInput();

    plr.setSpeed(.5);
    plr.setMaxSpeed(15.0);
    plr.setJumpForce(.4f);
    plr.setJumpSpeed(16.f);

    int state = MENU;
    sf::String str;
    str.SetText("Welcome to fatrunning!");
    sf::String str2;
    str2.SetText("Developed by Echoes Entertainment");
    str2.Move(0, 100);
    sf::String cont;
    cont.SetText("Please press enter to play...");
    cont.Move(0, 30);
    sf::String spd;

    sf::String menuHelp;
    menuHelp.SetText("Stand on the block equivalent to the level (0-15) and press TAB");
    menuHelp.Move(0, 30);
    float endTime = 60*5;
    float curTime = 0;

    sf::Sprite menu;
    sf::Image mim;
    mim.LoadFromFile("MenuBackground.png");
    menu.SetImage(mim);

    sf::String scr;
    sf::String thanks("Thanks for playing! Your score was: ");
    //sf::String tarantulas("                             Tarantual tarantulas         Everybody loves tarantulas         if there's just fuzz where your hamster was         it's propably because of tarantulas                                             They're so soft         and they're so furry         And they're so cute         if your vision's blurry         all of mine got free         but dont you worry         though they're crawling up your wall in a big hurry                                    Tarantual tarantulas         Everybody loves tarantulas         if there's just fuzz where your hamster was         it's propably because of tarantulas                                             Don't look now but i have a feeling         there's one above you on your ceiling         but when they crawl they never fall                 unless the person under them is nervous at all                            Tarantual tarantulas           Everybody loves tarantulas         if there's just fuzz where your hamster was             it's propably because of tarantulas                 \t        \t                   can you feel that itch   on the top of your head         it could be one of them crawling instead         but it wont bite unless it senses fear         so just stay calm til' it's gone in a year                \t\t                              Tarantual tarantulas            Everybody loves tarantulas         if there's just fuzz where your hamster was         it's propably because of tarantulas          Tarantual tarantulas         Everybody loves tarantulas         if there's just fuzz where your hamster was         it's propably because of tarantulas         if there's just fuzz where your hamster was         it's propably because of tarantulas          Tarantulas tarantulas         it's propably because of tarantulas");
    //.tarantulas.Move(3000, 0);
    thanks.Move(0, 30);
    scr.Move(500, 30);

    World world;
    world.addLevel("lvl1", "lvl1.txt");
    world.addLevel("lvl2", "lvl2.txt");
    world.addLevel("lvl3", "lvl3.txt");
    world.addLevel("lvl4", "lvl4.txt");
    world.addLevel("lvl5", "lvl5.txt");
    world.addLevel("lvl6", "lvl6.txt");
    world.addLevel("lvl7", "lvl7.txt");
    world.addLevel("lvl8", "lvl8.txt");
    world.addLevel("lvl9", "lvl9.txt");
    world.addLevel("lvl10", "lvl10.txt");
    world.addLevel("lvl11", "lvl11.txt");
    world.addLevel("lvl12", "lvl12.txt");
    world.addLevel("lvl13", "lvl13.txt");
    world.addLevel("lvl14", "lvl14.txt");
    world.addLevel("lvl15", "lvl15.txt");
    world.setMenuLevel("menu.txt");
    world.regPlr(plr);
    bool once = false;
    bool unodos = false;
    float finalScore = 0;

    while (state != DIE) 
    {
        sf::Event e;
        while (window.GetEvent(e))
        {
            if ( e.Type == sf::Event::Closed )
            {
                window.Close();
                state = EXIT;
            }
            if( e.Type == sf::Event::KeyPressed )
            {
                if(e.Key.Code == sf::Key::Return)
                {
                    if(!unodos)
                    {
                        state = GAME;
                        unodos = true;
                    }
                }
            }
        }
        getKeys(input);
        window.Clear();
        switch(state)
        {
            case MENU:
                if(startSong.GetStatus() == sf::Sound::Stopped)
                    startSong.Play();
                window.Draw(menu);
                window.Draw(str);
                window.Draw(str2);
                window.Draw(cont);
                break;
            case GAME:
                if(startSong.GetStatus() == sf::Sound::Playing)
                {
                    mIt = playList.begin();
                    (*mIt)->Play();
                    startSong.Stop();
                }
                if((*mIt)->GetStatus() == sf::Sound::Stopped)
                {
                    mIt++;
                    if(mIt == playList.end())
                        mIt = playList.begin();
                    (*mIt)->Play();
                }
                timer.Reset();
                spd.SetText(floatToString(endTime-plr.time));
                world.drawWorld(window);
                world.update(input);
                plr.update();
                window.Draw(plr.getSprite());
                window.Draw(spd);
                plr.time+=timer.GetElapsedTime();
                if(plr.time >= endTime || world.quit)
                {
                    state = EXIT;
                    plr.time = endTime;
                }
                if(world.atMenu)
                    state = PAUSE;
                break;
            case PAUSE:
                if(startSong.GetStatus() == sf::Sound::Playing)
                    startSong.Stop();
                spd.SetText(floatToString(endTime-plr.time));
                plr.update();
                world.drawWorld(window);
                world.update(input);
                window.Draw(plr.getSprite());
                window.Draw(spd);
                window.Draw(menuHelp);
                if(!world.atMenu)
                    state = GAME;
                if(world.quit)
                    state = EXIT;
                break;
            case EXIT:
                if(!once)
                {
                    endSong.Play();
                    (*mIt)->Stop();
                    world.addLevel("end", "end.txt");
                    world.setLevel("end");
                    once = true;
                    finalScore = plr.score;
                    finalScore += (endTime-plr.time);
                }
                //tarantulas.Move(-3.5, 0);
                plr.update();
                world.drawWorld(window);
                window.Draw(plr.getSprite());
                scr.SetText(floatToString(finalScore));
                //window.Draw(tarantulas);
                window.Draw(musicBy);
                window.Draw(thanks);
                window.Draw(scr);
                if(world.curLvl->atEnd)
                    state = DIE;
                break;  
            case DIE:
                window.Close();
                break;
            default:
                break;
        }
        window.Display();
    }

    return 0;
}

std::string floatToString(float flt)
{
    std::stringstream ss;
    ss << flt;
    return ss.str();
}

void getKeys(const sf::Input& input)
{
    if(input.IsKeyDown(sf::Key::D))
    {
        plr.isAcc = true;
        plr.right();
    }           
    else if(input.IsKeyDown(sf::Key::A))
    {
        plr.isAcc = true;
        plr.left();
    }
    if(input.IsKeyDown(sf::Key::Space))
    {
        plr.isJump = false;
        plr.jump();
    }
    if(!input.IsKeyDown(sf::Key::D) && !input.IsKeyDown(sf::Key::A))
    {
        plr.isAcc = false;
    }
    if(!input.IsKeyDown(sf::Key::Space))
        plr.isJump = true;
}

That is the whole main.cpp, if you need to look at the other sources, ask me. But the program crashes BEFORE it reaches main. It doesn't even reach the enum define.

4

3 回答 3

2

This could be due to any undefined or unspecified behavior in the constructors of objects with static lifetime. One of the most frequence causes, however, is order of initialization issues. Do some of your objects with static lifetime use other objects with static lifetime in their constructor? For example, does the constructor for player use a static object defined in World? Or even something from SFML? (A quick glance shows some objects with static lifetime in the library. You shouldn't use any of these in any of your constructors of objects with static lifetime.)

于 2013-02-26T14:43:01.260 回答
1

Run the program in the debugger (windbg.exe), that should show you where the exception occurs, with helpful progress text in the output window about what's been loaded so far, any 'swallowed' exceptions, and you can take it from there.

于 2013-02-26T14:16:04.503 回答
0

It's possible the crash is due to some incompatibility between how the EXE was compiled and how the library was compiled... check your code-generation flags, character sets, etc.

于 2013-02-26T13:55:54.123 回答