Несколько определений: в тупик

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

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

Я некоторое время искал в 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 );
}

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

0

Решение

Переместить определения ваших глобальных переменных в LUtil.cpp:

float zOffset = 0;

float noiseImage[640][480];

GLuint textureName;

затем объявлять переменные в LUtil.h:

extern float zOffset;

extern float noiseImage[640][480];

extern GLuint textureName;
6

Другие решения


По вопросам рекламы [email protected]