简体   繁体   English

移植到Windows时程序崩溃

[英]Program crash when ported to windows

As the title says, I have successfully compiled, linked and ran a program made in sfml-1.6 on Linux Mint 14. I used g++ for compiling. 如标题所示,我已经在Linux Mint 14上成功编译,链接并运行了sfml-1.6程序。我使用g ++进行编译。 However as soon as I moved the source files to Windows and tried to compile to the Windows equivalent of the sfml libraries, it crashes. 但是,一旦我将源文件移到Windows并尝试编译为sfml库的Windows等效文件,它就会崩溃。 The program compiles and links just fine but it crashes BEFORE it reaches main. 该程序可以正常编译和链接,但是在到达主程序之前会崩溃。 I have made sure I dont have any global objects/variables in my own .h files. 我已经确定自己的.h文件中没有任何全局对象/变量。 But I cannot do it for the sfml library. 但是我无法为sfml库执行此操作。 I suspected that it might be because the library was broken so I ported the code for sfml 2.0., and the problem persists. 我怀疑可能是因为库损坏了,所以我移植了sfml 2.0。的代码,问题仍然存在。 Any clues on what I am doing wrong? 关于我在做什么错的任何线索? I have also made sure I dont use any platform specific headers. 我还确保不使用任何平台特定的标题。

Here is my main.cpp 这是我的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. 这就是整个main.cpp,如果您需要查看其他资源,请问我。 But the program crashes BEFORE it reaches main. 但是程序在到达主程序之前崩溃。 It doesn't even reach the enum define. 它甚至没有达到枚举定义。

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? 例如,玩家的构造函数是否使用World中定义的静态对象? Or even something from SFML? 甚至来自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.) (快速浏览显示了库中某些具有静态生存期的对象。您不应在任何具有静态生存期的对象的构造函数中使用这些对象。)

在调试器( windbg.exe )中运行该程序,该程序应向您显示异常发生的位置,并在输出窗口中显示有用的进度文本,显示到目前为止已加载的内容,所有“被吞咽的”异常,您可以从那里获取。

崩溃的原因可能是EXE的编译方式与库的编译方式之间不兼容。请检查您的代码生成标志,字符集等。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM