用wxDev-C++编译SDL和OpenGL程序,就是同时包含SDL.h和gl.h头文件的程序。之前反复弄也弄不出来,去百度知道提问,不但没有得到帮助,还惹来一疯子,叫嚣“为什么放着好用的Visual Studio 系列不用,而非要用wxDev-C++之类的?现在有很多书,或者人在误导大家,用什么命令行编译,看起来很酷,但实际毫无用处,这些事交给编译器做有什么不好呢?有这些精力多集中在代码和算法上不是很好么? 那你倒说说开源的好在哪?现在跟风的人真是不少”。这种人一看就知道相当自私的,不解决问题还一个劲的叫嚣,让人看了就不爽。
不说Visual Studio系列的好坏,可是也没有见过自私到看别人开源都不爽的人啊,疯子到处都有,看来以后百度问问题得小心一些了。如果命令行真的毫无用处,相信Windows也不会保留CMD了,跟疯子是没有道理可讲的。
关闭提问问题,自己解决。逛了几圈国外的论坛和国内的CSDN以后。终于有了灵感。有一次编译的时候报错:[Linker error] undefined reference to `WinMain@16' ,百度谷歌了好久,说是找不到程序的编译入口,用MingW32的时候要将-lmingw32放在连接器命令的最前面才可以,这才知道,原来连接器命令是有顺序的,于是开始反复调整顺序,终于,调试出来了:
-lmingw32 -lSDLmain -lopenGL32 -lglu32 -lglut32 -mwindows -lopengl32 -lglu32 –lSDL
然后就可以编译运行了,按上下左右方向键就可以旋转那三条直线。
下面是程序的源码:testSDLGL.cpp
/*
坐标观察程序,
ESC:退出
F5:复位
LEFT/RIGHT:以绿色Y为轴心旋转
UP/DOWN:以红色X为轴心旋转
PAGEUP/PAGEDOWN:以蓝色z为轴心旋转
*/
#include <GL/gl.h>
#include <SDL/SDL.h>
bool running=true;
float x=0.0,y=0.0,z=0.0;
enum Target{modelview,projection};
Target target=modelview;
void initGL()
{
SDL_Init(SDL_INIT_VIDEO);
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
SDL_SetVideoMode(600,300,16,SDL_OPENGL);
}
void destroyGL()
{
SDL_Quit();
}
void drawCoordinate()
{
glBegin(GL_LINES);
glLineWidth(10.0f);
glColor3f(1,0,0);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glColor3f(0,1,0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glColor3f(0,0,1);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
glEnd();
}
void draw()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
if(target==modelview)
{
glMatrixMode(GL_MODELVIEW);
}
else
{
glMatrixMode(GL_PROJECTION);
}
glLoadIdentity();
glRotatef(x,1,0,0);
glRotatef(y,0,1,0);
glRotatef(z,0,0,1);
glMatrixMode(GL_MODELVIEW);
drawCoordinate();
SDL_GL_SwapBuffers();
}
void switchTarget()
{
if(((int)target+1)>((int)projection))
{
target=modelview;
}else
{
target=(Target)((int)target+1);
}
}
void reset()
{
x=0;
y=0;
z=0;
}
void quit()
{
running=false;
}
void onKeyDown(const SDL_Event& event)
{
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
quit();
break;
case SDLK_TAB:
switchTarget();
break;
case SDLK_F5:
reset();
break;
case SDLK_LEFT:
y+=1;
break;
case SDLK_RIGHT:
y-=1;
break;
case SDLK_UP:
x+=1;
break;
case SDLK_DOWN:
x-=1;
break;
case SDLK_PAGEUP:
z+=1;
break;
case SDLK_PAGEDOWN:
z-=1;
break;
}
}
void loop()
{
SDL_Event event;
while(running)
{
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
quit();
break;
case SDL_KEYDOWN:
onKeyDown(event);
break;
}
}
draw();
SDL_Delay(50);
}
}
int main(int argc,char* argv[])
{
initGL();
loop();
destroyGL();
return 0;
}
程序运行后的结果,旋转了一下直线的位置,要不刚运行出来就两条直线,要旋转才能看到第三条。
经过测试和精简,最后连接器的命令为:-lmingw32 -lSDLmain -lSDL -lglut32 -mwindows -lopengl32
其中-mwindows若去掉的话,会显示命令行窗口。
最后不要忘记将SDL.dll放到本程序所在路径。