Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zmienne globalne w pliku nagłówkowym

Ostatnio zmodyfikowano 2012-05-05 11:58
Autor Wiadomość
Trix
Temat założony przez niniejszego użytkownika
Zmienne globalne w pliku nagłówkowym
» 2012-05-05 11:08:55
Wyświetla mi błąd podczas stworzenia zmiennej globalnej w OGL.

Mam 2 pliki cpp, jeden to "ciało" programu OGL a drugi zawiera funkcje rysującą różne modele .obj
Łączy je plik nagłówkowy draw.h

Tak wygląda testowy plik draw.h
C/C++
#ifndef __OBJECT DRAW__H__
#define __OBJECT DRAW__H__

#include <gl\gl.h> // nagłówek dla opengl32
#include <gl\glu.h> // nagłowek dla glu32
#include <gl\glaux.h> // nagłówek dla glaux

// identyfikator listy wyświetlania z obiektem
GLuint OBJECT_LIST;

bool first_level();

#endif

A tak plik rysujący draw.cpp
C/C++
#include "obj.h"
#include "draw.h"


bool first_level()
{
    char filename[] = "cube.obj";
    if( !load_obj( filename, OBJECT_LIST ) )
    {
        MessageBox( NULL, "Bład podczas wczytania plików modeli.", "BŁĄD", MB_OK | MB_ICONINFORMATION );
        return FALSE;
    }
    return TRUE;
}

Gdy zmienna GLuint OBJECT_LIST; znajduje się w pliku draw.cpp jest wszystko ok ale gdy już w .h to linker wyświetla błąd:

draw.obj : error LNK2005: "unsigned int OBJECT_LIST" (?OBJECT_LIST@@3IA) already defined in main.obj
C:\programy w c++\gra 3d\Debug\gra 3d.exe : fatal error LNK1169: one or more multiply defined symbols found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Może źle definiuje tą zmienną?
P-56042
xevuel
» 2012-05-05 11:11:39
Z logu wynika, że zmienną
GLuint OBJECT_LIST
 deklarujesz też w pliku main.cpp jako zmienną globalną, co powoduje konflikt.
P-56043
Admixior
» 2012-05-05 11:58:31
Problem:
Masz plik main.cpp i draw.cpp w obu tych plikach dołączasz draw.h.
W draw.h masz DEFINICJE obiektu...
Czyli jak kompilujesz main to dodajesz definicje i w draw.cpp też jest definicja, więc jest multidefinicja (być nie może:).

Rozwiązanie:
Do pliku draw.cpp lub main.cpp skopiuj definicje (to co jest w draw.h), a następnie dopisz "extern" przed definicją w pliku draw.h, co spowoduje że zmienisz ją w deklaracje, których może być ile chcesz.
P-56046
« 1 »
  Strona 1 z 1