main.cpp:(.texte+0x5f): undefined reference to
J'essaie de compiler un peu d'exercice à partir d'une SDL guide.
Je compile comme ceci:
g++ -o main main.cpp -I/usr/local/include/SDL2 -L/usr/local/lib -lSDL2
et j'obtiens ceci:
/tmp/cci2rYNF.o: In function `main':
main.cpp:(.text+0x5f): undefined reference to `Game::init(char const*, int, int, int, int, int)'
collect2: error: ld returned 1 exit status
et mon code est:
main.cpp
#include "Game.h"
//our Game object
Game* g_game = 0;
int main(int argc, char* argv[])
{
g_game = new Game();
g_game->init("Chapter 1", 100, 100, 640, 480, 0);
while(g_game->running())
{
g_game->handleEvents();
g_game->update();
g_game->render();
}
g_game->clean();
return 0;
}
Jeu.h
#ifndef __Game__
#define __Game__
#include <SDL.h>
class Game
{
public:
Game() {}
~Game() {}
bool init(const char* title, int xpos, int ypos, int width, int height, int flags);
void render(){}
void update(){}
void handleEvents(){}
void clean(){}
//a function to access the private running variable
bool running() { return m_bRunning; }
private:
SDL_Window* m_pWindow;
SDL_Renderer* m_pRenderer;
bool m_bRunning;
};
#endif //defined(__Game__) */
Game.cpp
#include "Game.h"
bool Game::init(const char* title, int xpos, int ypos, int width, int height, int flags)
{
//attempt to initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
std::cout << "SDL init success\n";
//init the window
m_pWindow = SDL_CreateWindow(title, xpos, ypos,
width, height, flags);
if(m_pWindow != 0) //window init success
{
std::cout << "window creation success\n";
m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
if(m_pRenderer != 0) //renderer init success
{
std::cout << "renderer creation success\n";
SDL_SetRenderDrawColor(m_pRenderer,
255,255,255,255);
}
else
{
std::cout << "renderer init fail\n";
return false; //renderer init fail
}
}
else
{
std::cout << "window init fail\n";
return false; //window init fail
}
}
else
{
std::cout << "SDL init fail\n";
return false; //SDL init fail
}
std::cout << "init success\n";
m_bRunning = true; //everything inited successfully, start main loop
return true;
}
void Game::render()
{
SDL_RenderClear(m_pRenderer); //clear the renderer to the draw color
SDL_RenderPresent(m_pRenderer); //draw to the screen
}
void Game::clean()
{
std::cout << "cleaning game\n";
SDL_DestroyWindow(m_pWindow);
SDL_DestroyRenderer(m_pRenderer);
SDL_Quit();
}
void Game::handleEvents()
{
SDL_Event event;
if(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
m_bRunning = false;
break;
default:
break;
}
}
}
- Eh bien, vous n'avez pas de lien game.cpp s'objet fichier.
- Toujours le même: beaucoup de temps perdu et comme une stupide erreur. Je dois apprendre un peu g++. Merci!
Vous devez vous connecter pour publier un commentaire.
Le C et le C++, le concept d'une "unité de compilation", c'est le fichier source, le compilateur a été appelé avec et tout le code qu'il
#include
s.GCC, MSVC et la plupart des autres compilateurs génèrent un intermédiaire "fichier objet" (.o ou .obj) pour chaque unité de compilation. Ceux-ci doivent ensuite être combinées ensemble, avec toutes les bibliothèques, à la forme de l'exécutable final, dans une étape appelée "liaison".
Avec GCC, il ya quelques façons de le faire. Commande unique:
Cette compile file1.cpp et file2.cpp séparément (chaque est toujours une seule unité de compilation) pour les fichiers objets et ensuite les liens de l'objet résultant des fichiers à un fichier exécutable appelé "app.exe" (vous n'avez pas besoin .exe, je suis juste en utilisant pour plus de clarté)
Ou plusieurs commandes:
Effectue l'étape de la compilation sur chaque rpc individuellement et effectue ensuite un lien distinct étape avec 'g++' agissant comme un front-end pour chaque étape. Remarque le
-c
dans les deux premières lignes, ce qui indique que vous voulez compiler en C/C++ source .objet. La 3e ligne, le compilateur avant la fin de l'reconnaît que vous demandez pour compiler les fichiers objets, et les chiffres que vous voulez faire l'étape de liaison.La première méthode est souvent plus facile pour les petits projets, la deuxième méthode est utile lorsque vous utilisez n'importe quel type de système de construction, et les choses commencent à se compliquer.
Vous n'êtes pas de la compilation
Game.cpp
. Essayez:Le problème est que même si vous
#include
dGame.h
dansmain.cpp
, il fait référence à des fonctions qui sont définies dansGame.cpp
. Sans compiler qu'ainsi, l'éditeur de liens n'ont pas les définitions nécessaires à la création d'un fichier exécutable.J'ai trouvé que
g++ -o driver driver.cpp Class.cpp
m'a aidé.