объекты, не работающие в SDL (C )

#c #class #object #sdl #undefined

#c #класс #объект #sdl #не определено

Вопрос:

Я работаю над простой игрой на C с SDL в качестве моего API. Я поместил свои функции обработки изображений в класс в отдельном документе, чтобы он был менее беспорядочным в моем основном файле. Однако, когда я пытаюсь вызвать функции, используя объект для класса, моя среда разработки сообщает, что я делаю неопределенную ссылку на функции. Вот основной файл:

 #include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include "imageBlitingFunctions.h"
#include <iostream>
#include <string>
#include <sstream>

int screenW = 640;
int screenH = 480;
int screenBPP = 32;

SDL_Surface* window = SDL_SetVideoMode(screenW, screenH, screenBPP, SDL_SWSURFACE);

imageBlitingFunctions IBFobject;

SDL_Surface* background1;
SDL_Surface* player1;

int main(int argc, char* args[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    TTF_Init();

    background1 = IBFobject.loadIMG("background.png");
    player1 = IBFobject.loadIMG("swordtest.png");

    IBFobject.blitIMG(0, 0, window, background1, 0, 0, 1000, 1000);
    IBFobject.blitIMG(0, 0, window, player1, 100, 0, 100, 300);

    SDL_FreeSurface(background1);
    SDL_FreeSurface(player1);

    SDL_Quit();

    return 0;
}
 

Вот заголовок для класса:

 #include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include <iostream>
#include <string>
#ifndef IMAGEBLITINGFUNCTIONS_H
#define IMAGEBLITINGFUNCTIONS_H


class imageBlitingFunctions
{
    public:
        SDL_Surface *loadIMG(std::string filename);

        void blitIMG(int pX, int pY, SDL_Surface *window, SDL_Surface *image, int cpX, int cpY, int cpH, int cpW);

        SDL_Surface *loadText(int red, int blue, int green, std::string fontname, int fontSize, std::string text);
};

#endif // IMAGEBLITINGFUNCTIONS_H
 

И вот класс:

 #include "imageBlitingFunctions.h"
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include <iostream>
#include <string>

SDL_Surface* imageBlitingFunctions::loadIMG(std::string filename)
{
    SDL_Surface *img = IMG_Load(filename.c_str());

    SDL_Surface *imgOPT = SDL_DisplayFormat(img);

    SDL_FreeSurface(img);

    return imgOPT;
}

void imageBlitingFunctions::blitIMG(int pX, int pY, SDL_Surface *window, SDL_Surface *image, int cpX, int cpY, int cpH, int cpW)
{
    SDL_Rect positionIMG;
    positionIMG.x = pX;
    positionIMG.y = pY;

    SDL_Rect clipP;
    clipP.x = cpX;
    clipP.y = cpY;
    clipP.h = cpH;
    clipP.w = cpW;

    SDL_BlitSurface(image, amp;clipP, window, amp;positionIMG);

    SDL_Flip(window);
}

SDL_Surface* imageBlitingFunctions::loadText(int red, int blue, int green, std::string fontname, int fontSize, std::string text)
{
    int color1 = red;
    int color2 = blue;
    int color3 = green;

    SDL_Color textColor = {color1, color2, color3};

    TTF_Font *font1 = TTF_OpenFont(fontname.c_str(), fontSize);

    SDL_Surface *message1 = TTF_RenderText_Solid(font1, text.c_str(), textColor);

    return message1;
}
 

Любая помощь будет оценена.

Ответ №1:

Неопределенная ссылка на функцию означает, что компоновщик не может найти определение функции. Определение функции — это то, что вы ввели в код «И вот класс:» (может быть, вы его называете imageBlitingFunctions.cpp или что-то подобное?) итак, проблема в том, что вы IDE не можете найти этот файл.

Чтобы решить эту проблему, вам необходимо исправить конфигурацию проекта.

Комментарии:

1. Спасибо, это решило проблему. Оказалось, что я не добавил класс и файл заголовка в свои исходные тексты. Но теперь у меня новая проблема, программа запускается нормально, но окно сразу же закрывается после открытия, а консоль сообщает, что «процесс вернул 3». Я запустил отладчик, и он говорит, что это ошибка сегментации?