c++ - 多个定义 : Stumped

标签 c++ opengl definitions

我有一个简单的程序,使用 FreeGLUT、OpenGL 和 Eliot Eshelman 的一些不错的单纯形噪声函数。目标是显示一些 3D 单纯形噪声的 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();
}

主要.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 );
}

据我所知,没有多重定义,但我可能是错的。 再一次,如果我是提出这个问题的“那个人”,我很抱歉。

最佳答案

将全局变量的定义移动到LUtil.cpp:

float zOffset = 0;

float noiseImage[640][480];

GLuint textureName;

然后声明LUtil.h中的变量:

extern float zOffset;

extern float noiseImage[640][480];

extern GLuint textureName;

关于c++ - 多个定义 : Stumped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25858847/

相关文章:

std::find_if 中的 C++ lambda 表达式?

linux - 是否使用 Xvfb 运行 OpenGL 效果版本?

c++ - 在 C++ 中使用相同定义重载函数

Java varargs - 为什么这些语法 Not Acceptable ?

Java 定义 : Label, token

c++ - 使用自定义 less 运算符实现迭代 std::map 会给出更少的元素

c++ - 使用 QSettings 保存 QSpinBox 和 QComboBox 的组合

c++ - 编写 C++ 运算符重载?

c - OpenGL 绕其局部轴旋转对象

java - 如何在 GLSL 中绑定(bind)统一位置?