2014-09-16 6 views
0

У меня есть простая программа, использующая FreeGLUT, OpenGL и некоторые симплексные шумовые функции от Eliot Eshelman. Цель состоит в том, чтобы отобразить 2D-фрагменты в виде 3D-симплексного шума, с которым я справился с SDL.Несколько определений: Stumped

Моя проблема: я получаю несколько ошибок определения, которые я не могу решить.

Я искал в Google и на этих форумах какое-то время. Я узнал о довольно многих вещах, которые могут вызвать ошибки, НО я не могу найти причину. Я был в тупике от этих ошибок в течение многих часов.

Вот мои соответствующие источники и выходы ошибок.

Обратите внимание, что ошибок, которые я получаю, может быть больше, но я не смог отладить достаточно далеко, чтобы добраться до них.

Выход:

-------------- Build: Release in OpenGL Test (compiler: GNU GCC Compiler)--------------- 

mingw32-g++.exe -Wall -O2 -std=c++11 -IC:\freeglut\include -c "C:\OpenGL Test\OpenGL Test\main.cpp" -o obj\Release\main.o 
mingw32-g++.exe -LC:\freeglut\lib -o "bin\Release\OpenGL Test.exe" obj\Release\LUtil.o obj\Release\main.o obj\Release\simplexnoise.o -s -lmingw32 -lOpenGL32 -lglu32 -lfreeglut -mwindows 
obj\Release\main.o:main.cpp:(.bss+0x0): multiple definition of `textureName' 
obj\Release\LUtil.o:LUtil.cpp:(.bss+0x0): first defined here 
obj\Release\main.o:main.cpp:(.bss+0x20): multiple definition of `noiseImage' 
obj\Release\LUtil.o:LUtil.cpp:(.bss+0x20): first defined here 
obj\Release\main.o:main.cpp:(.bss+0x12c020): multiple definition of `zOffset' 
obj\Release\LUtil.o:LUtil.cpp:(.bss+0x12c020): first defined here 
collect2.exe: error: ld returned 1 exit status 
Process terminated with status 1 (0 minute(s), 0 second(s)) 
0 error(s), 0 warning(s) (0 minute(s), 0 second(s)) 

LUtil.h:

/*This source code copyrighted by Lazy Foo' Productions (2004-2013) 
and may not be redistributed without written permission.*/ 
//Version: 001 

#ifndef LUTIL_H 
#define LUTIL_H 

#include "LOpenGL.h" 

#include "simplexnoise.h" 

//Screen Constants 
const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 
const int SCREEN_FPS = 60; 

float zOffset = 0; 

float noiseImage[640][480]; 

GLuint textureName; 

bool initGL(); 
/* 
Pre Condition: 
-A valid OpenGL context 
Post Condition: 
-Initializes matrices and clear color 
-Reports to console if there was an OpenGL error 
-Returns false if there was an error in initialization 
Side Effects: 
-Projection matrix is set to identity matrix 
-Modelview matrix is set to identity matrix 
-Matrix mode is set to modelview 
-Clear color is set to black 
*/ 

void update(); 
/* 
Pre Condition: 
-None 
Post Condition: 
-Does per frame logic 
Side Effects: 
-None 
*/ 

void render(); 
/* 
Pre Condition: 
-A valid OpenGL context 
-Active modelview matrix 
Post Condition: 
-Renders the scene 
Side Effects: 
-Clears the color buffer 
-Swaps the front/back buffer 
*/ 

#endif 

LUtil.cpp:

/*This source code copyrighted by Lazy Foo' Productions (2004-2013) 
and may not be redistributed without written permission.*/ 
//Version: 001 

#include "LUtil.h" 

bool initGL() 
{ 
    //Initialize Projection Matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    //Initialize Modelview Matrix 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    //Initialize clear color 
    glClearColor(0.f, 0.f, 0.f, 1.f); 

    //Check for error 
    GLenum error = glGetError(); 
    if(error != GL_NO_ERROR) 
    { 
     printf("Error initializing OpenGL! %s\n", gluErrorString(error)); 
     return false; 
    } 

    glGenTextures(1, &textureName); 
    glBindTexture(GL_TEXTURE_2D, textureName); 

    return true; 
} 

void update() 
{ 
    for(int y = 0; y < SCREEN_HEIGHT; y++) 
    { 
     for(int x = 0; x < SCREEN_WIDTH; x++) 
     { 
       noiseImage[x][y] = raw_noise_3d(x, y, zOffset); 
       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGB, GL_FLOAT, &noiseImage[0][0]); 
     } 
    } 
} 

void render() 
{ 
    //Clear color buffer 
    glClear(GL_COLOR_BUFFER_BIT); 

    glColor4f(1, 0.5f, 0, 1); 

    //Render quad 
    glBegin(GL_QUADS); 
     glTexCoord2f( -1.f, -1.f); 
     glTexCoord2f( -1.f, 1.f); 
     glTexCoord2f(1.f, -0.f); 
     glTexCoord2f(1.f, 1.f); 
    glEnd(); 

    //Update screen 
    glutSwapBuffers(); 
} 

main.cpp:

/*This source code copyrighted by Lazy Foo' Productions (2004-2013) 
and may not be redistributed without written permission.*/ 
//Version: 001 

#include "LUtil.h" 

void runMainLoop(int val); 
/* 
Pre Condition: 
-Initialized freeGLUT 
Post Condition: 
-Calls the main loop functions and sets itself to be called back in 1000/SCREEN_FPS milliseconds 
Side Effects: 
-Sets glutTimerFunc 
*/ 

int main(int argc, char* args[]) 
{ 
    //Initialize FreeGLUT 
    glutInit(&argc, args); 

    //Create OpenGL 2.1 context 
    glutInitContextVersion(4, 4); 

    //Create Double Buffered Window 
    glutInitDisplayMode(GLUT_DOUBLE); 
    glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT); 
    glutCreateWindow("OpenGL"); 

    //Do post window/context creation initialization 
    if(!initGL()) 
    { 
     printf("Unable to initialize graphics library!\n"); 
     return 1; 
    } 

    //Set rendering function 
    glutDisplayFunc(render); 

    //Set main loop 
    glutTimerFunc(1000/SCREEN_FPS, runMainLoop, 0); 

    //Start GLUT main loop 
    glutMainLoop(); 

    return 0; 
} 

void runMainLoop(int val) 
{ 
    //Frame logic 
    update(); 
    render(); 

    //Run frame one more time 
    glutTimerFunc(1000/SCREEN_FPS, runMainLoop, val); 
} 

Насколько я могу судить, множественных определений нет, но я могу ошибаться. Еще раз, извините, если я «Тот парень» с этим вопросом.

+4

Как правило, вы не хотите определить переменные (или объекты) в файлах .h. Подобно 'GLuint textureName;', если вам нужно использовать такие глобальные переменные, затем определите их в соответствующем .cpp-файле, а затем используйте 'extern', чтобы объявить их в других файлах. – mbadawi23

+1

Вы должны узнать разницу между ** декларацией ** и ** ** **. –

+1

Двойной include не должен быть проблемой, поскольку он, кажется, имеет правильный #ifndef. Но действительно, определения, вызывающие предупреждения, не должны быть в файле .h. – Pieter21

ответ

6

переместить ОПРЕДЕЛЕНИЯ ваших глобальных variabls в LUtil.cpp:

float zOffset = 0; 

float noiseImage[640][480]; 

GLuint textureName; 

Тогда объявить в variabls в LUtil.h:

extern float zOffset; 

extern float noiseImage[640][480]; 

extern GLuint textureName; 
Смежные вопросы