简体   繁体   English

SDL2_ttf错误:找不到入口点

[英]SDL2_ttf error: Entry point not found

So, while trying to add sdl_ttf to my game project, a wierd error popped up: http://i.imgur.com/RJ32QIs.png 因此,在尝试将sdl_ttf添加到我的游戏项目时,弹出了一个奇怪的错误: http ://i.imgur.com/RJ32QIs.png

Everything worked fine beforehand, and the problem started when I added TTF_Init()... 事前一切正常,当我添加TTF_Init()时问题开始了。

These are the files in my project: 这些是我项目中的文件:

main.cpp: main.cpp中:

#include <sdl.h>
#include <sdl_image.h>
#include <sdl_ttf.h>
#include <stdio.h>
#include "CEngine.h"

int main(int argc, char *argv[]){
    CEngine Engine;

    //Start up SDL and create window
    if(!Engine.OnInit())
    {
        printf("Failed to initialize!\n");
    }

    //Loading in the gfx
    SDL_Surface* Surf_Player = Engine.LoadSurface("./gfx/player.png");
    SDL_Surface* Surf_Tile_Grass = Engine.LoadSurface("./tilesets/grass.png");
    SDL_Surface* Surf_Tile_Stone = Engine.LoadSurface("./tilesets/stone.png");

    bool Running = true;

    //Player Location
    int PlayerX = 64;
    int PlayerY = 64;

    //Map
    char Map[16][21]={"####################",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "#                  #",
                      "####################",};

    //Event handler
    SDL_Event e;

    //Main game loop
    while(Running){
        //Handle the events
        while(SDL_PollEvent(&e)){
            if(e.type==SDL_QUIT){
                Running = false;
            }
            //User presses a key
            else if(e.type == SDL_KEYDOWN){
                //Check which key was pressed
                switch(e.key.keysym.sym){
                    case SDLK_x:
                        Running = false;
                        break;
                    case SDLK_a:
                        if(Map[(PlayerX/Engine.TILE_SIZE)-1][PlayerY/Engine.TILE_SIZE]!='#'){
                            PlayerX-=32;
                        }
                        break;
                    case SDLK_d:
                        if(Map[(PlayerX/Engine.TILE_SIZE)+1][PlayerY/Engine.TILE_SIZE]!='#'){
                            PlayerX+=32;
                        }
                        break;
                    case SDLK_w:
                        if(Map[PlayerX/Engine.TILE_SIZE][(PlayerY/Engine.TILE_SIZE)-1]!='#'){
                            PlayerY-=32;
                        }
                        break;
                    case SDLK_s:
                        if(Map[PlayerX/Engine.TILE_SIZE][(PlayerY/Engine.TILE_SIZE)+1]!='#'){
                            PlayerY+=32;
                        }
                        break;
                    case SDLK_F1:
                        PlayerX = 64;
                        PlayerY = 64;
                        break;
                }
            }
        }
        //Apply the image
        for(int y = 0; y < (Engine.SCREEN_HEIGHT/Engine.TILE_SIZE); y++){
            for(int x = 0; x <= ((Engine.SCREEN_WIDTH/Engine.TILE_SIZE)-1); x++){
                SDL_Rect Rect_Temp;
                Rect_Temp.x=x*Engine.TILE_SIZE;
                Rect_Temp.y=y*Engine.TILE_SIZE;
                if(Map[y][x] == ' '){
                    SDL_BlitSurface(Surf_Tile_Grass, NULL, Engine.Surf_Screen, &Rect_Temp);
                }
                else if(Map[y][x] == '#'){
                    SDL_BlitSurface(Surf_Tile_Stone, NULL, Engine.Surf_Screen, &Rect_Temp);
                }
            }
        }
        SDL_Rect Rect_Temp;
        Rect_Temp.x = PlayerX;
        Rect_Temp.y = PlayerY;
        SDL_BlitSurface(Surf_Player, NULL, Engine.Surf_Screen, &Rect_Temp);
        //Update the surface
        SDL_UpdateWindowSurface(Engine.Window);
    }

    //Free resources and close SDL
    Engine.OnExit();
    return 0;
}

CEngine.h: CEngine.h:

#ifndef CENGINE_H
#define CENGINE_H

#include <SDL.h>
#include <SDL_Image.h>
#include <SDL_TTF.h>
#include <string>
#include <stdio.h>

class CEngine
{
    public:
        CEngine();

        bool OnInit();
        void OnExit();
        SDL_Surface* LoadSurface(std::string path);

        SDL_Window* Window;

        SDL_Surface* Surf_Screen;

        const int SCREEN_WIDTH = 640;
        const int SCREEN_HEIGHT = 480;

        const char* WINDOW_TITLE = "Game";

        const char TILE_SIZE = 32;
};

#endif // CENGINE_H

CEngine.cpp: CEngine.cpp:

#include "CEngine.h"

CEngine::CEngine(){
    //The window where surfaces will be rendered to
    Window = NULL;

    //The surface contained by the window
    Surf_Screen = NULL;
}

bool CEngine::OnInit(){
    //Initialize SDL
    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
        return false;
    }

    //Create a window
    Window = SDL_CreateWindow("Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    if(Window == NULL){
        printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
        return false;
    }

    //Initialize PNG loading
    int imgFlags = IMG_INIT_PNG;
    if(!(IMG_Init(imgFlags) & imgFlags)){
        printf("SDL_image could not initialize. SDL_image Error: %s\n", IMG_GetError());
        return false;
    }

    //Initilize SDL_TTF
    if(TTF_Init() == -1){
        printf("SDL_TTF could not initilize! SDL_TTF Error: %s", TTF_GetError());
        return false;
    }

    //Get window surface
    Surf_Screen = SDL_GetWindowSurface(Window);

    return true;
}

void CEngine::OnExit(){
    //Destroy window
    SDL_DestroyWindow(Window);
    Window = NULL;

    //Cleans up the sdl_image subsystems(?)
    IMG_Quit();

    //Cleans up all initilized subsystems
    SDL_Quit();
}

SDL_Surface* CEngine::LoadSurface(std::string path){
    //Optimized image
    SDL_Surface* Surf_Optimized = NULL;

    //Load the image
    SDL_Surface* Surf_Loaded = IMG_Load(path.c_str());
    if(Surf_Loaded == NULL)
    {
        printf("Unable to load image %s. SDL Error: %s.\n", path.c_str(), IMG_GetError());
        return NULL;
    }

    //Converting the loaded surface to screen format
    Surf_Optimized = SDL_ConvertSurface(Surf_Loaded, Surf_Screen->format, 0);
    if(Surf_Optimized == NULL){
        printf("Unable to optimize image %s. SDL Error: %s.", path.c_str(), SDL_GetError());
    }

    //Get rid of the unoptimized version
    SDL_FreeSurface(Surf_Loaded);

    //Return the surface
    return Surf_Optimized;
}

These are my linker settings: http://i.imgur.com/Gyq5khi.png 这些是我的链接器设置: http : //i.imgur.com/Gyq5khi.png

And it was compiled using mingw 4.7 (Update: Tried with 4.8, the same error appeared) 并使用mingw 4.7进行了编译(更新:尝试过4.8,出现了相同的错误)

Thanks in advance. 提前致谢。 (I'm sorry if I'm asking a dumb question, but I couldn't find an answer anywhere.) (很抱歉,我想问一个愚蠢的问题,但在任何地方都找不到答案。)

This is a runtime error rather than a link time error. 这是运行时错误,而不是链接时间错误。 It looks like there is no libfreetype-6.dll in your build folder (where your executable is), or if is there, it is corrupted and you need one that is working. 您的构建文件夹(可执行文件所在的文件夹)中似乎没有libfreetype-6.dll ,或者如果存在,则它已损坏,您需要一个正在运行的文件。 Just ensure that your libfreetype-6.dll and zlib.dll are correct and working versions that are compatible with mingw-4.7 只要确保您的libfreetype-6.dllzlib.dll是正确的并且与mingw-4.7兼容的工作版本即可

Edit 编辑

In my experience, the only foolproof way of getting things to work on mingw is to ensure that every dll is built with the same version of mingw. 以我的经验,使事情在mingw上运行的唯一简单方法是确保每个dll都使用相同版本的mingw构建。

I haven't had dll incompatibility problems since I switched to Nuwen distro ( http://nuwen.net/mingw.html ) and started building all dependencies manually. 自从我切换到Nuwen发行版( http://nuwen.net/mingw.html )并开始手动构建所有依赖项以来,我没有dll不兼容的问题。

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

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