Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL2 ne marche que sur main.cpp

SDL2 sous VSC - marche dans main.cpp, pas dans les fichiers en require

24 août 2019 à 16:23:42

Bonjour,

peut-être que ce post a déjà été créé, et/ou déjà répondu, mais j'ai pas mal cherché et je ne trouve pas de réponse pour mon cas.

C::B me gonfle depuis un certain temps, surtout que je l'utilise uniquement pour le cpp, et tout le reste sous VSC.

J'ai donc configuré VSC pour le cpp. Tout avait l'air ok jusqu'à...

Je travail sous VSC (windows 10), et lorsque je compile du code d'SDL2 et OpenGL3 dans mon main.cpp, tout fonctionne.

Seulement, dès que je créé une classe, que je require et instancie dans mon main, cette classe ne trouve apparemment pas SDL2...

Merci en avance pour votre aide ^^

voici l'erreur:

C:\Users\username\AppData\Local\Temp\cc6gbqMS.o:SceneOpenGL.cpp:(.text+0x97): undefined reference to `SDL_Init'
collect2.exe: error: ld returned 1 exit status
The terminal process terminated with exit code: 1



main.cpp

#include "include/common.h" // include des librairies et des constantes
#include "include/SceneOpenGL.h" // include de la scene global (nouvelle fenetre (SDL2) et environnement 3D (OpenGL3))

int main(int argc, char **argv) {

    SceneOpenGL scene("test", WINDOW_WIDTH, WINDOW_HEIGHT); // nouvelle scene (fenetre nommée test, width et height de la fenetre)
    
    if(scene.init_window() == false) return 1; // execute la methode d'initialisation de la fenetre. si erreur, arrete le programme

    // end of program
    return 0;
}


SceneOpenGL.h:

#ifndef SCENEOPENGL
#define SCENEOPENGL

#include "common.h" // include toutes les librairies (SDL2 et OpenGL3)

class SceneOpenGL {
    public:
        SceneOpenGL(std::string title, int window_width, int window_height); // constructeur
        ~SceneOpenGL(); // destructeur
        bool init_window(); // initialise une nouvelle fenetre (SDL2)

    private:
        int m_width, m_height; // size of window
        std::string m_title; // title of window

        SDL_Window* m_window; // stockage de la fenetre
};

#endif // SCENEOPENGL

SceneOpenGL.cpp:

#include "../include/common.h" // include toutes les librairies (SDL2 et OpenGL3)
#include "../include/SceneOpenGL.h" // include son header

SceneOpenGL::SceneOpenGL(std::string title, int window_width, int window_height): // constructeur
    m_title(title), m_width(window_width), m_height(window_height) { // association des variables

}

SceneOpenGL::~SceneOpenGL() { // destructeur
    /* SDL_Quit(); */ // detruit la fenetre
}

bool SceneOpenGL::init_window() { // initialise une nouvelle fenetre (SDL2)
    std::cout << "width: " << WINDOW_WIDTH <<std::endl; // test voir si une constante de common.h est bien importée
    // si ca affiche un int, alors, common.h est bien importée, donc la librairie SDL2 aussi

    Uint32 a = SDL_Init(SDL_INIT_VIDEO); // initialisation de SDL
    std::cout << "a: " << a << std::endl; // affiche un int (suivant l'int dit si initialisé ou pas)

    if(a < 0) { // si -1 alors erreur
        std::cout << "Erreur d'initialisation de SDL" << std::endl;
        return false;
    }

    return true;
}

Common.h:

#ifndef _COMMON_H
#define _COMMON_H

/*=======STANDARD TEMPLATE LIBRARY=======*/
#include <iostream>
#include <stdio.h>
#include <string>

/*=======LIBRARIES SDL + OPENGL + GLEW=======*/
#ifdef _WIN32
// GLEW
#include <GL/glew.h>

// Include Mac
#elif __APPLE__
#define GL3_PROTOTYPES 1
#include <OpenGL/gl3.h>

// Include UNIX/Linux
#else
#define GL3_PROTOTYPES 1
#include <GL3/gl3.h>

#endif // OS FOR GLEW

// SDL2
#include <SDL2/SDL.h>

// GLM
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/glm.hpp>
#include <glm/gtx/transform.hpp>
#include <glm/gtc/type_ptr.hpp>

// WINDOW SIZE
#define WINDOW_WIDTH            1200
#define WINDOW_HEIGHT           700


Arborescence:

main.cpp
| include
    | common.h
    | SceneOpenGL.h
| src
    | SceneOpenGL.cpp

et la configuration de VSC (dans .vscode -> task.json):

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "testing c++",
            "type": "shell",
            "command": "g++",
            "args": [
                "main.cpp",

                "-lmingw32",
                "-lSDL2main",
                "-lSDL2",
                "-lSDL2_image",
                "-lSDL2_mixer",
                "-lSDL2_ttf",

                "-lopengl32",
                "-lglew32",
                "-lglu32",
                
                "include/SceneOpenGL.h",
                "src/SceneOpenGL.cpp",

                "-o","test.exe"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}





-
Edité par NoxFly 24 août 2019 à 16:42:21

  • Partager sur Facebook
  • Partager sur Twitter
25 août 2019 à 23:31:26

Et en remontant le fichier SceneOpenGL.cpp avant les librairies dont il dépend, au niveau des arguments de ta commande g++?

  • Partager sur Facebook
  • Partager sur Twitter
3 septembre 2019 à 18:21:33

g++ main.cpp -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -lopengl32 -lglew32 -lglu32 include/SceneOpenGL.h src/SceneOpenGL.cpp -o program.exe
  • Partager sur Facebook
  • Partager sur Twitter