LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 这个错误是没有主函数的main()的错吧。你要先搭个OpenGL的框架,再调用那几个函数。不关类的事。// shortest.c // The shortest OpenGL program possible#include <windows.h> // Standard Window header required for all programs #include <conio.h> // Console I/O functions #include <gl\gl.h> // OpenGL functions #include <gl\glaux.h> // AUX Library functionsvoid main(void) { // These are the AUX functions to set up the window auxInitDisplayMode(AUX_SINGLE | AUX_RGBA); auxInitPosition(100,100,250,250); auxInitWindow("My first OpenGL Program"); // These are the OpenGL functions that do something in the window glClearColor(0.0f, 0.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glFlush(); // Stop and wait for a keypress cprintf("Press any key to close the Window\n"); getch(); }
1 Particle.h文件:
#define MAX_PARTICLES 1000 // 定义粒子数量
GLfloat speedFator = 1.0f; // 粒子运动速度的控制因子
GLfloat angle_Z; // 粒子旋转
static GLfloat colors[12][3]= // 粒子颜色数组
{{0.5f, 0.5f, 1.0f}, {0.75f, 0.5f, 1.0f}, {1.0f, 0.5f, 1.0f}, {0.5f, 1.0f, 0.5f},
{1.0f, 1.0f, 0.5f}, {0.75f, 1.0f, 0.5f}, {1.0f, 0.5f, 0.5f}, {1.0f, 0.75f, 0.5f},
{1.0f, 0.5f, 0.75f}, {0.5f, 1.0f, 0.75f}, {0.5f, 1.0f, 1.0f}, {0.5f, 0.75f, 1.0f}
};// 星空粒子系统
typedef struct
{
float life; // 粒子生命
float fade; // 粒子衰减速度
float r,g,b; // 粒子的颜色
float x,y,z; // 粒子位置
float xSpeed,ySpeed,zSpeed; // 粒子的速度
float xg,yg,zg; // 粒子的运动加速度
} PARTICLES;
PARTICLES particle[MAX_PARTICLES]; // 粒子系统数组
// 初始化星空粒子系统
void ParticleInit(void);
//绘制星空粒子系统
void DrawParticle(void);
2 Particle.cpp文件
#include <stdio.h> // 标准输入输出头文件
#include <olectl.h> // OLE控制库头文件
#include <math.h> // 数学函数头文件
#include <gl\gl.h> // OpenGL32库的头文件
#include "Texture.h"
#include "Particle.h"// 初始化星空粒子系统
void ParticleInit(void)
{
for (int loop=0; loop<MAX_PARTICLES; ++loop)
{
particle[loop].life = 1.0f;// 赋予每个粒子完整生命
particle[loop].fade = float(rand()%100)/1000.0f+0.003f; 命衰减速度
particle[loop].r = colors[rand()%12][0]; // 粒子颜色的红色分量
particle[loop].g = colors[rand()%12][1]; // 粒子颜色的绿色分量
particle[loop].b = colors[rand()%12][2]; // 粒子颜色的蓝色分量
particle[loop].xSpeed = float((rand()%300)-150.0f);沿x轴的随机速度(-150,150)
particle[loop].ySpeed = float((rand()%300)-150.0f);沿y轴的随机速度(-150,150)
particle[loop].zSpeed = float(rand()%150); // 沿z轴的随机速速(0,150)
particle[loop].xg = 0.0f; // 沿x轴的加速度
particle[loop].yg = 0.0f; // 沿y轴的加速度
particle[loop].zg = 8.0f; // 沿z轴的加速度
}
}void DrawParticle(void)
{
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 选择混合方式
float x,y,z;
for (int loop=0; loop<MAX_PARTICLES; ++loop) // 循环绘制
{
x = particle[loop].x; // 定义粒子坐标
y = particle[loop].y;
z = particle[loop].z; // 用glColor4f绘制粒子的颜色和透明度(生命),用life减fade即可得到粒子的生命变化
glColor4f(particle[loop].r, particle[loop].g, particle[loop].b, particle[loop].life); glBegin(GL_TRIANGLE_STRIP); // 绘制粒子
glTexCoord2f(1.0f, 1.0f); glVertex3f(x + 0.5f, y + 0.5f, z);
glTexCoord2d(0.0f, 1.0f); glVertex3f(x - 0.5f, y + 0.5f, z);
glTexCoord2d(1.0f, 0.0f); glVertex3f(x + 0.5f, y - 0.5f, z);
glTexCoord2d(0.0f, 0.0f); glVertex3f(x - 0.5f, y - 0.5f, z);
glEnd(); // 粒子位置更新
particle[loop].x += particle[loop].xSpeed/(speedFator*1000.0f); // x轴上的位置
particle[loop].y += particle[loop].ySpeed/(speedFator*1000.0f); // y轴上的位置
particle[loop].z += particle[loop].zSpeed/(speedFator*1000.0f); // z轴上的位置 // 粒子速度更新
particle[loop].xSpeed += particle[loop].xg;
particle[loop].ySpeed += particle[loop].yg;
particle[loop].zSpeed += particle[loop].zg; particle[loop].life -= particle[loop].fade;// 粒子生命的衰减 if (particle[loop].life <= 0.0f)// 如果粒子衰减到0
{
particle[loop].life = 1.0f; // 赋予新生命
particle[loop].fade = float(rand()%100)/1000.0f+0.003f; // 随机衰减速度
particle[loop].x = 0.0f; // 新粒子在(0.0f,0,0f,0.0f)处
particle[loop].y = 0.0f;
particle[loop].z = 0.0f;
particle[loop].xSpeed = float((rand()%60)-30.0f);// x轴速度与方向
particle[loop].ySpeed = float((rand()%60)-30.0f);// y轴速度与方向
particle[loop].zSpeed = float(rand()%30); // z轴速度与方向
particle[loop].r = colors[rand()%12][0];// 选择随机颜色的(r,g,b)值
particle[loop].g = colors[rand()%12][1];
particle[loop].b = colors[rand()%12][2];
}
}
}
e:\计算机图形学\星空8_1类封装\5dg's stars.cpp(74) : error C2501: 'Particle' : missing storage-class or type specifiers
e:\计算机图形学\星空8_1类封装\5dg's stars.cpp(74) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
#ifndef xxx
#define xxx...你原来的东西.
#endif
1 Particle.h文件
#ifndef Particle_H
#define Particle_H
#define MAX_PARTICLES 1000 // 定义粒子数量
GLfloat speedFator = 1.0f; // 粒子运动速度的控制因子
GLfloat angle_Z; // 粒子旋转
static GLfloat colors[12][3]= // 粒子颜色数组
{{0.5f, 0.5f, 1.0f}, {0.75f, 0.5f, 1.0f}, {1.0f, 0.5f, 1.0f}, {0.5f, 1.0f, 0.5f},
{1.0f, 1.0f, 0.5f}, {0.75f, 1.0f, 0.5f}, {1.0f, 0.5f, 0.5f}, {1.0f, 0.75f, 0.5f},
{1.0f, 0.5f, 0.75f}, {0.5f, 1.0f, 0.75f}, {0.5f, 1.0f, 1.0f}, {0.5f, 0.75f, 1.0f}
};
// 星空粒子系统
typedef struct
{
float life; // 粒子生命
float fade; // 粒子衰减速度
float r,g,b; // 粒子的颜色
float x,y,z; // 粒子位置
float xSpeed,ySpeed,zSpeed; // 粒子的速度
float xg,yg,zg; // 粒子的运动加速度
} PARTICLES;
PARTICLES particle[MAX_PARTICLES]; // 粒子系统数组
// 初始化星空粒子系统
void ParticleInit(void);//绘制星空粒子系统
void DrawParticle(void);
#endif2 Particle.cpp文件
#include <stdio.h> // 标准输入输出头文件
#include <olectl.h> // OLE控制库头文件
#include <math.h> // 数学函数头文件
#include <gl\gl.h> // OpenGL32库的头文件
#include "Texture.h"
#include "Particle.h"
// 初始化星空粒子系统
void ParticleInit(void)
{
for (int loop=0; loop<MAX_PARTICLES; ++loop)
{
particle[loop].life = 1.0f; // 赋予每个粒子完整生命
particle[loop].fade = float(rand()%100)/1000.0f+0.003f; // 粒子生命命衰减速度
particle[loop].r = colors[rand()%12][0]; // 粒子颜色的红色分量
particle[loop].g = colors[rand()%12][1]; // 粒子颜色的绿色分量
particle[loop].b = colors[rand()%12][2]; // 粒子颜色的蓝色分量
particle[loop].xSpeed = float((rand()%300)-150.0f);//沿x轴的随机速度(-150,150)
particle[loop].ySpeed = float((rand()%300)-150.0f);//沿y轴的随机速度(-150,150)
particle[loop].zSpeed = float(rand()%150); // 沿z轴的随机速度(0,150)
particle[loop].xg = 0.0f; // 沿x轴的加速度
particle[loop].yg = 0.0f; // 沿y轴的加速度
particle[loop].zg = 8.0f; // 沿z轴的加速度
}
}void DrawParticle(void)
{
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 选择混合方式
float x,y,z;
for (int loop=0; loop<MAX_PARTICLES; ++loop) // 循环绘制
{
x = particle[loop].x; // 定义粒子坐标
y = particle[loop].y;
z = particle[loop].z; // 用glColor4f绘制粒子的颜色和透明度(生命),用life减fade即可得到粒子的生命变化
glColor4f(particle[loop].r, particle[loop].g, particle[loop].b, particle[loop].life); glBegin(GL_TRIANGLE_STRIP); // 绘制粒子
glTexCoord2f(1.0f, 1.0f); glVertex3f(x + 0.5f, y + 0.5f, z);
glTexCoord2d(0.0f, 1.0f); glVertex3f(x - 0.5f, y + 0.5f, z);
glTexCoord2d(1.0f, 0.0f); glVertex3f(x + 0.5f, y - 0.5f, z);
glTexCoord2d(0.0f, 0.0f); glVertex3f(x - 0.5f, y - 0.5f, z);
glEnd(); // 粒子位置更新
particle[loop].x += particle[loop].xSpeed/(speedFator*1000.0f); // x轴上的位置
particle[loop].y += particle[loop].ySpeed/(speedFator*1000.0f); // y轴上的位置
particle[loop].z += particle[loop].zSpeed/(speedFator*1000.0f); // z轴上的位置 // 粒子速度更新
particle[loop].xSpeed += particle[loop].xg;
particle[loop].ySpeed += particle[loop].yg;
particle[loop].zSpeed += particle[loop].zg; particle[loop].life -= particle[loop].fade;// 粒子生命的衰减 if (particle[loop].life <= 0.0f)// 如果粒子衰减到0
{
particle[loop].life = 1.0f; // 赋予新生命
particle[loop].fade = float(rand()%100)/1000.0f+0.003f; // 随机衰减速度
particle[loop].x = 0.0f; // 新粒子在(0.0f,0,0f,0.0f)处
particle[loop].y = 0.0f;
particle[loop].z = 0.0f;
particle[loop].xSpeed = float((rand()%60)-30.0f);// x轴速度与方向
particle[loop].ySpeed = float((rand()%60)-30.0f);// y轴速度与方向
particle[loop].zSpeed = float(rand()%30); // z轴速度与方向
particle[loop].r = colors[rand()%12][0];// 选择随机颜色的(r,g,b)值
particle[loop].g = colors[rand()%12][1];
particle[loop].b = colors[rand()%12][2];
}
}
}
好想上面的定义有错,可能的确不是类封装。
5DG'S Stars.obj : error LNK2001: unresolved external symbol "void __cdecl ParticleInit(void)" (?ParticleInit@@YAXXZ)
5DG'S Stars.obj : error LNK2001: unresolved external symbol "int __cdecl BuildTexture(char *,unsigned int &)" (?BuildTexture@@YAHPADAAI@Z)
5DG'S Stars.obj : error LNK2001: unresolved external symbol "void __cdecl DrawParticle(void)" (?DrawParticle@@YAXXZ)
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/5DG'S Stars.exe : fatal error LNK1120: 4 unresolved externals
class/struct *{
public:
....private:
.....
}
类型 *::函数名()
{...}
不过类的封装和定义一样吗?那咋么把一个类的封装分到两个文件里:.h和.cpp呢?
结构体是封装的一种简单应用,你这个没有类啊!类封装到,.h和.cpp便于复用、调试和改错。
你的问题不是上述程序的语法问题,和你的工程中的其他文件有关系。
{
float life; // 粒子生命
float fade; // 粒子衰减速度
float r,g,b; // 粒子的颜色
float x,y,z; // 粒子位置
float xSpeed,ySpeed,zSpeed; // 粒子的速度
float xg,yg,zg; // 粒子的运动加速度
} PARTICLES;
========
你这个全是成员变量,成员函数呢
// 初始化星空粒子系统
void ParticleInit(void);//绘制星空粒子系统
void DrawParticle(void);
#endif
你的问题不是上述程序的语法问题,和你的工程中的其他文件有关系。
我觉得你的问题是你没有把c++面向对象的思想搞清楚,也不理解类和封装,建议看教材。
这里的错误我估计是成员函数与全局函数的问题。
如果void ParticleInit(void);void DrawParticle(void);这两个函数是成员函数,那么应该写成:
class XXX
{
public:
void ParticleInit(void);
void DrawParticle(void);
};而且cpp里应该写成
void XXX::ParticleInit(void)
{
//...
}
void XXX::DrawParticle(void)
{
//...
}
其中XXX::表示函数为XXX类的成员函数。
调用时是:
XXX xx;//定义类变量
xx.DrawParticle();
xx.ParticleInit();而现在产生链接错误,我怀疑是你这两个函数定义的作用域有问题,要不就是include的头文件有问题,导致没有编译,或者其它问题。建议你检查函数定义以及头文件包含。还有就是头文件里有没有写#pragam once或者写成:
#ifndef __XXX_H
#define __XXX_H
//你自己的类
class
{
//
};#endif否则也会有一堆链接错误。
#include <iostream.h>
class complex
{
public:
complex();
complex(double r,double i);//这两个是构造函数
friend void print(const complex &c);//类的成员函数声明
private:
double real,imag;
};
//上面这个是类的定义,也就是写在h文件中的
void complex::print(const complex &c)//类的成员函数实现
{
if(c.imag<0)
cout<<c.real<<c.imag<<'i';
else
cout<<c.real<<'+'<<c.imag<<'i';
}
//这些是类的实现,是写在CPP文件中的,我只写了一个函数,你自己比较一下吧。
这个错误是没有主函数的main()的错吧。你要先搭个OpenGL的框架,再调用那几个函数。不关类的事。// shortest.c
// The shortest OpenGL program possible#include <windows.h> // Standard Window header required
for all programs
#include <conio.h> // Console I/O functions
#include <gl\gl.h> // OpenGL functions
#include <gl\glaux.h> // AUX Library functionsvoid main(void)
{
// These are the AUX functions to set up the window
auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
auxInitPosition(100,100,250,250);
auxInitWindow("My first OpenGL Program"); // These are the OpenGL functions that do something in the window
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); glFlush(); // Stop and wait for a keypress
cprintf("Press any key to close the Window\n");
getch();
}