- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个看似常见的问题,但我似乎无法在我的代码上下文中解决它。我最近开始上课,在没有 C++ 知识的情况下,我被扔进了 C++ 和 OpenGL,所以请放轻松。这是我的 3 个文件,用于打开 OpenGL 窗口;然而,我遇到了一个不错的 LNK2005 错误:
error LNK2005: "public: static unsigned int JWindow::id" (?id@JWindow@@2IA) already defined in Application.obj X:\School\comp2501\COMP2501Tutorial1\COMP2501Tutorial1\Main.obj COMP2501Tutorial1
我似乎找不到我在哪里重新定义了给我这个错误的东西。
主要.cpp
#include <windows.h> // Standard header for MS JWindows applications
#include <freeglut.h>
#include "Application.h"
#define KEY_ESCAPE 27
static GLfloat lightPos[] = { 1.0, 1.0, 1.0, 0.0 };
void drawCube(GLdouble x0, GLdouble x1, GLdouble y0, GLdouble y1, GLdouble z0, GLdouble z1) {/**/}
int main(int argc, char **argv) {
JWindow::create(640, 480, "Tutorial 1", 45.0f, 0.1f, 500.0f);
// initialize and run program
glutInit(&argc, argv); // GLUT initialization
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); // Display Mode (RGBA color|two screen buffers| use depth buffer)
glutInitWindowSize(JWindow::width, JWindow::height); // set JWindow size
glutDisplayFunc(JWindow::display); // register display function
glutIdleFunc(JWindow::display); // register idle function
glutKeyboardFunc(JWindow::keyboard); // register keyboard function
glutCloseFunc(JWindow::close); // register close function
JWindow::initialize(); // intialization
glutMainLoop(); // run GLUT mainloop
}
应用程序.h
class JWindow{
public:
static void updateProjection();
static void render();
static void initialize();
static void timer(int);
static void display();
static void close();
static void create(int, int, char*, float, float, float);
static void keyboard(unsigned char, int, int);
static GLuint id;
static char* title;
static int width;
static int height;
static float fovAngle;
static float zNear;
static float zFar;
};
GLuint JWindow::id = 0;
char* JWindow::title = "JWindow";
int JWindow::width = 0;
int JWindow::height = 0;
float JWindow::fovAngle = 0.0f;
float JWindow::zNear = 0.0f;
float JWindow::zFar = 0.0f;
应用程序.cpp
#include <freeglut.h>
#include "Application.h"
#define KEY_ESCAPE 27
void JWindow::updateProjection()
{
glutSetWindow(JWindow::id); // tell opengl which JWindow you want to change
JWindow::height = (JWindow::height < 1) ? 1 : JWindow::height; // make sure we are not dividing by zero for the aspect
glViewport(0, 0, JWindow::width, JWindow::height); // set the viewport
glMatrixMode(GL_PROJECTION); // select projection matrix
glLoadIdentity(); // reset projection matrix
GLfloat aspect = (GLfloat)JWindow::width / JWindow::height; // calculate aspect ratio
gluPerspective(JWindow::fovAngle, aspect, JWindow::zNear, JWindow::zFar); // set up a perspective projection matrix
}
// Render data to the screen
void JWindow::render()
{
glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen and Depth Buffer
glMatrixMode(GL_MODELVIEW); // Tell opengl we are working with the modelview matrix
glLoadIdentity(); // Set the modelview matrix to the identity matrix
gluLookAt(0.0f, 0.0f, 10.0f, //position
0.0f, 0.0f, 0.0f, //look at position
0.0f, 1.0f, 0.0f); //up vector
/*
glBegin(GL_TRIANGLES); // Send the following information as triangles
glColor4f(1.0f, 0.0f, 0.0f, 1.0f); // glColor4f(red,green,blue,alpha)
glVertex3f(-1.0f, -1.0f, 0.0f); // glVertex3f(x,y,z)
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd(); // tell opengl we are done sending data
*/
//drawCube(-1, 1, -1, 1, -1, 1);
glutSolidTorus(1, 2, 10, 10);
glutSwapBuffers(); //works with GL_DOUBLE. use glFlush(); instead, if using GL_SINGLE
}
// Function called when timer ends
void JWindow::timer(int id) {
glutPostRedisplay(); // Tell GLUT to call it's glutDisplayFunc
}
// Set new timer and render
void JWindow::display(void)
{
glutTimerFunc(17, timer, 1); //Call timer function in at least 17 milliseconds
glutSetWindow(JWindow::id); //Tell glut which JWindow we are working on (only needed for multiple JWindows)
JWindow::render(); //Call our render function
}
//get keyboard input
void JWindow::keyboard(unsigned char key, int mousePositionX, int mousePositionY)
{
switch (key)
{
case KEY_ESCAPE:
glutExit(); //if ESC key is pressed, quit
break;
default:
break;
}
}
// callback function when glut ends
void JWindow::close()
{
//memory cleanup when program quits
}
void JWindow::initialize()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glViewport(0, 0, JWindow::width, JWindow::height); // set the viewport
glMatrixMode(GL_PROJECTION); // select projection matrix
glLoadIdentity(); // reset projection matrix
GLfloat aspect = (GLfloat)JWindow::width / JWindow::height; // calculate aspect ratio
gluPerspective(JWindow::fovAngle, aspect, JWindow::zNear, JWindow::zFar); // set up a perspective projection matrix
}
void reshape(GLint newWidth, GLint newHeight) {
}
void JWindow::create(int w, int h, char* t, float fov, float n, float f){
JWindow::width = w;
JWindow::height = h;
JWindow::title = t;
JWindow::fovAngle = fov;
JWindow::zNear = n;
JWindow::zFar = f;
JWindow::id = glutCreateWindow(JWindow::title);
}
最佳答案
您应该将静态成员的初始化移动到您的 Application.cpp
文件中:
GLuint JWindow::id = 0;
char* JWindow::title = "JWindow";
int JWindow::width = 0;
int JWindow::height = 0;
float JWindow::fovAngle = 0.0f;
float JWindow::zNear = 0.0f;
float JWindow::zFar = 0.0f;
这些是静态成员的定义。如果您将它们包含在多个翻译单元中(您已经这样做了),那么您就有了多个定义。
关于c++ - LNK2005(已定义)找不到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27891840/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!