SDL2_ttf错误:没有找到入口点

SDL2_ttf error: Entry point not found

本文关键字:入口 ttf 错误 SDL2      更新时间:2023-10-16

所以,当尝试将sdl_ttf添加到我的游戏项目时,一个奇怪的错误弹出:https://i.stack.imgur.com/DkjH5.png

之前一切正常,当我添加TTF_Init()时问题开始了…

这些是我的项目中的文件:

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:

#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:

#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: %sn", 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: %sn", 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: %sn", 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;
}

这些是我的链接器设置:https://i.stack.imgur.com/yEjg6.png

并且它是使用mingw 4.7编译的(更新:尝试使用4.8,出现相同的错误)

提前感谢。(如果我问了一个愚蠢的问题,我很抱歉,但我在任何地方都找不到答案。)

这是一个运行时错误,而不是链接时间错误。看起来在你的构建文件夹(你的可执行文件所在的地方)没有libfreetype-6.dll,或者如果有,它是损坏的,你需要一个工作。只要确保您的libfreetype-6.dllzlib.dll是正确的,并且工作版本与mingw-4.7兼容

编辑

在我的经验中,让事情在mingw上工作的唯一万无一失的方法是确保每个dll都是用相同版本的mingw构建的。

自从我切换到Nuwen发行版(http://nuwen.net/mingw.html)并开始手动构建所有依赖项以来,我没有遇到过dll不兼容问题。