一、VS2013搭建OpenGL环境
1. 下载 OpenGL库(我本人的网盘)
OpenGL库:http://yunpan.cn/ccyvuYTPBU6iL 访问密码 e17f
glut全称为:OpenGL Utility Toolkit,也就是OpenGL应用工具包,它建立在OpenGL基础之上,方便开发OpenGL的某些功能,比如我们后面
要创建的Windows程序,就可以用glut来方便地构建起一个初始化的Windows程序。
2. 安装glut库
说是安装,其实就是复制。
解压开这个zip包,会发现其中包含如下几个文件:
*.h:头文件,复制到D:/Program Files (x86)
/
Microsoft Visual Studio 11.0
/
VC
/
include/gl目录下(如果没有gl目录,需要自己来新建gl目录)
*.lib:静态链接库,复制到D:
/
Program Files (x86)
/
Microsoft Visual Studio 11.0
/
VC
/
lib目录下
*.dll:动态链接库,复制到C:
/
Windows
/
System32目录下,64位操作系统的,还需要复制到C:
/
Windows
/
SysWOW64目录下。
3、创建工程
(1) 文件-->新建-->项目--》Visual C++-->Win32-->Win32控制台应用程序-->项目的名称、位置、解决方案名称(M)、自己设定-->确定
(2)确定-->下一步--> 附加选项-->选择空项目(E)
(3)出现如下画面
(4)右击源文件-->添加-->新建项目-->代码-->C++文件(.cpp)-->名称中写入-->main.cpp
(5)测试代码如下
#include <GL/glut.h>
void myDisplay(void )
{
//清除函数,GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它东西
glClear( GL_COLOR_BUFFER_BIT );
//画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
//保证前面的OpenGL命令立即执行(而不是让它在缓冲区中等待)
glFlush();
}
int main(int argc, char * argv[])
{
//对GLUT进行初始化
glutInit(& argc , argv );
//设置显示方式,GLUT_RGB表示使用RGB颜色、GLUT_INDEX表示使用索引颜色、GLUT_SINGLE表示使用单缓冲、GLUT_DOUBLE表示使用双缓冲
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE );
//设置窗口在屏幕上的位置
glutInitWindowPosition(100, 100);
//设置窗口的大小
glutInitWindowSize(400, 400);
//根据前面设置的信息创建窗口,参数作为窗口的标题。注意:窗口创建后,并不立即显示在屏幕上。需要调用glutMainLoop才能看到窗口
glutCreateWindow( "第一个OpenGL程序" );
//当显示图画时,请调用myDisplay函数,于是没有myDisplay函数就用来画图
glutDisplayFunc(&myDisplay);
//进行一个消息循环
glutMainLoop();
return 0;
}
(6)
点击F5、编译通过,
出现如下画面
二、编译过程中遇到如下问题如何解决
问题一、
错误 1 error LNK2019: 无法解析的外部符号 __imp____glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用
K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 2 error LNK2019: 无法解析的外部符号 __imp____glutCreateWindowWithExit@8,该符号在函数_glutCreateWindow_ATEXIT_HACK@4 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 3 error LNK1120: 2 个无法解析的外部命令 K:\OpenGL_text\one_text\double_buffer\Debug\double_buffer.exe 1 1
double_buffer
方法一
在
#include
<GL/glut.h>头文件之前加入
#define GLUT_DISABLE_ATEXIT_HACK
方法二:
解决办法右击工程属性
:(配置(C): 所有配置-->
配置属性
-->C/C++-->预处理器-->预处理器定义-->在预处理器 后面写入GLUT_BUILDING_LIB
--
>应用-->确定
问题二、
错误 1 error LNK2019: 无法解析的外部符号 __imp__glBegin@4,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ) 中被引
用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 2 error LNK2019: 无法解析的外部符号 __imp__glClear@4,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ) 中被引
用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 3 error LNK2019: 无法解析的外部符号 __imp__glClearColor@16,该符号在函数 "void __cdecl init(void)" (?init@@YAXXZ) 中被引
用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 4 error LNK2019: 无法解析的外部符号 __imp__glColor3f@12,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ) 中
被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 5 error LNK2019: 无法解析的外部符号 __imp__glEnd@0,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ) 中被引
用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 6 error LNK2019: 无法解析的外部符号 __imp__glLoadIdentity@0,该符号在函数 "void __cdecl reshape(int,int)" (?
reshape@@YAXHH@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 7 error LNK2019: 无法解析的外部符号 __imp__glMatrixMode@4,该符号在函数 "void __cdecl reshape(int,int)" (?
reshape@@YAXHH@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 8 error LNK2019: 无法解析的外部符号 __imp__glOrtho@48,该符号在函数 "void __cdecl reshape(int,int)" (?
reshape@@YAXHH@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 9 error LNK2019: 无法解析的外部符号 __imp__glPopMatrix@0,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ)
中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 10 error LNK2019: 无法解析的外部符号 __imp__glPushMatrix@0,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ)中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 11 error LNK2019: 无法解析的外部符号 __imp__glRotatef@16,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 12 error LNK2019: 无法解析的外部符号 __imp__glShadeModel@4,该符号在函数 "void __cdecl init(void)" (?init@@YAXXZ) 中被
引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 13 error LNK2019: 无法解析的外部符号 __imp__glVertex2f@8,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ) 中
被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 14 error LNK2019: 无法解析的外部符号 __imp__glViewport@16,该符号在函数 "void __cdecl reshape(int,int)" (?
reshape@@YAXHH@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 15 error LNK2019: 无法解析的外部符号 _glutInit@8,该符号在函数 "void __cdecl createWindow(int,char * * const)" (?
createWindow@@YAXHQAPAD@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 16 error LNK2019: 无法解析的外部符号 _glutInitDisplayMode@4,该符号在函数 "void __cdecl createWindow(int,char * * const)" (?createWindow@@YAXHQAPAD@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 17 error LNK2019: 无法解析的外部符号 _glutInitWindowPosition@8,该符号在函数 "void __cdecl createWindow(int,char * * const)" (?createWindow@@YAXHQAPAD@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 18 error LNK2019: 无法解析的外部符号 _glutInitWindowSize@8,该符号在函数 "void __cdecl createWindow(int,char * * const)" (?createWindow@@YAXHQAPAD@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 19 error LNK2019: 无法解析的外部符号 _glutMainLoop@0,该符号在函数 _main 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 20 error LNK2019: 无法解析的外部符号 _glutCreateWindow@4,该符号在函数 "void __cdecl createWindow(int,char * * const)" (?
createWindow@@YAXHQAPAD@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 21 error LNK2019: 无法解析的外部符号 _glutPostRedisplay@0,该符号在函数 "void __cdecl spinDisplay(void)" (?
spinDisplay@@YAXXZ) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 22 error LNK2019: 无法解析的外部符号 _glutSwapBuffers@0,该符号在函数 "void __cdecl display(void)" (?display@@YAXXZ) 中
被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 23 error LNK2019: 无法解析的外部符号 _glutDisplayFunc@4,该符号在函数 _main 中被引用
K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 24 error LNK2019: 无法解析的外部符号 _glutReshapeFunc@4,该符号在函数 _main 中被引用
K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 25 error LNK2019: 无法解析的外部符号 _glutMouseFunc@4,该符号在函数 _main 中被引用
K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 26 error LNK2019: 无法解析的外部符号 _glutIdleFunc@4,该符号在函数 "void __cdecl mouse(int,int,int,int)" (?
mouse@@YAXHHHH@Z) 中被引用 K:\OpenGL_text\one_text\double_buffer\double_buffer\main.obj double_buffer
错误 27 error LNK1120: 26 个无法解析的外部命令 K:\OpenGL_text\one_text\double_buffer\Debug\double_buffer.exe
double_buffer
解决办法右击工程属性
:(配置(C): 活动(Debug)
-->配置属性-->连接器-->输入-->附加依赖项-->在附加依赖项里面写入后面写入
OPENGL32.lib;opengl.lib;GLUT32.lib;glut.lib;GLU32.lib;glu.lib;glew32s.lib;glew32mx.lib;glew32mxs.lib;glew32.lib;GLAUX.lib;(这些库提前必须
在
D:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/lib已经存在
)
-->确定
问题三、VMware Workstation与Hyper-V不兼容。请先从系统中移除Hyper-V角色,然后再运行VMware Workstation。
今天在用win8.1的时候发现了这个问题,解决办法如下
今天在用win8.1的时候发现了这个问题,解决办法如下
第一步
第二步
第三步重启系统
问题四、
无法解析的外部符号_main,该符号在函数_tmainCRTStartup中被调用
在编程时经常遇到“无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用”这样的错误,最近看了一些这方面的书籍,现将解
决方案大概叙述一下:
连接程序在负责连接可执行程序时,选择相应的c/c++运行时启动函数。如果设定了/subsystem:windows连接程序开关,那么连接程序会试图寻找
WinMain或wWinMain函数。
如果连个函数都不存在,那么就会返回一个“一个未解决的外部符号”(无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引
用)同样,如果设定了/subsystem:console
连接程序开关,那么连接程序就会试图寻找main函数或者wmain函数,如果找不到这连个函数是,连接程序返回unresolved externel symbol错误
信息。变成新手容易犯的一个错误是,
创建应用程序时选择了错误的应用程序类型。例如,开发人员创建了一个新的Win32应用程序项目,并给这个项目创建了一个入口函数main。在
这种情况下,创建应用程序时,开发人员就
会看到一个连接程序的错误信息。这是因为Win32应用程序项目设置了/subsystem:windows连接程序开关,但是却找不到相应的Winmain或者
wWinmain函数。这是侯你可以有以下几种解决方案。
1 将main函数改为Winmain函数
2 将/subsystem:windows开关改为/subsytem:console
3全部删除/subsytem:windows开关,让连接程序根据源代码中实现的函数进行正确的操作。
更改/subsystem:windows的方法:
右键点击-->项目,选择---->属性,属性页 窗口弹出;
2 将/subsystem:windows开关改为/subsytem:console
3全部删除/subsytem:windows开关,让连接程序根据源代码中实现的函数进行正确的操作。
更改/subsystem:windows的方法:
右键点击-->项目,选择---->属性,属性页 窗口弹出;
接着,点击连接器->系统,在右侧会看到“子系统”选项,在这里可以选择相应的连接程序开关.
问题五安装安装VAssistX
下载地址http://yunpan.cn/ccZQpeN5i2wT3 访问密码 059c
解压后直接安装
去掉VS中对汉字的拼写检查后留下的红色波浪线
原因在于VAssistx
在VAssistX菜单栏->Visual Assist X Options->展开Advanced->Underlines->把underlines spelling errors in comments and strings using的钩去掉就行了
Window下配置OpenGL ES开发环境
1. 下载AMD的OpenGL ES2.0的模拟器,下载地址:
http://www.opengles-book.com/ESEmulator.2009-04-28-v1.4.APRIL_2009_RELEASE.msi
2. 下载《OpenGL ES2.0 Programming guide》里的例子代码,下载地址:
http://www.opengles-book.com/OpenGL_ES_Programming_Guide_v1.0.2.zip
3. 安装vs, 我机器上安装的是vs2012。
4.
安装OpenGL ES2.0模拟器, 将安装目录下的AMD\OpenGL ES 2.0 Emulator v1.4\bin 以及AMD\OpenGL ES 2.0 Emulator v1.4\lib 里的 libEGL.dll
、 libGLESv2.dll 和 libEGL.lib 、libGLESv2.lib分别拷贝至vs2012\VC的bin和lib文件夹下。
5. 解压上面下载的例子代码
6. 打开OpenGL_ES_Programming_Guide_v1.0.2\Chapter_2\Hello_Triangle下的sln文件
7.
如果生成解决方案的时候出现了类似于does not match the Linker’s OutputFile property value…的警告信息,程序运行会提示没有找到exe文件,
解决方案:
(1) 右键项目esUtil,配置属性-库管理器-常规-输出文件,把$(OutDir)esUtil_d.lib改成$(OutDir)esUtil.lib
(2) 右键项目Hello_Triangle:
配置属性-链接器-常规,把输出文件改成:Debug\$(ProjectName).exe
输入-附加依赖项:esUtil_d.lib改成esUtil.lib
重新生成解决方案,运行效果如下:
Linux配置OpenGL ES开发环境
0) sudo apt-get install libgles2-mesa-dev
1) sudo apt-get install libgles1-mesa libgles1-mesa-dev
2) sudo apt-get install freeglut3 freeglut3-dev
3) gcc ./*.c -o "XXX" -L/usr/lib/x86_64-linux-gnu/ -lGLESv1_CM -lglut
编写C/C++代码问题
如果是windows程序:
1.菜单中选择 Project->Properties, 弹出Property Pages窗口
2.在左边栏中依次选择:Configuration Properties->C/C++->Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_CONSOLE,
添加_WINDOWS.
3.在左边栏中依次选择:Configuration Properties->Linker->System,然后在右边栏的SubSystem对应的项改为Windows(/SUBSYSTEM:WINDOWS)
如果是控制台程序:
1.菜单中选择 Project->Properties, 弹出Property Pages窗口
2.在左边栏中依次选择:Configuration Properties->C/C++->Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_WINDOWS,
添加_CONSOLE.
3.在左边栏中依次选择:Configuration Properties->Linker->System,然后在右边栏的SubSystem对应的项改为CONSOLE(/SUBSYSTEM:CONSOLE)