您的位置:首页 > 运维架构

学习Open GL在VS2013编译过程中遇到的问题

2015-10-24 09:46 561 查看
一、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)测试代码如下

[align=left]#include <GL/glut.h>[/align]
[align=left]void myDisplay(void )[/align]
[align=left]{[/align]
[align=left] //清除函数,GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它东西[/align]
[align=left] glClear( GL_COLOR_BUFFER_BIT );[/align]
[align=left] //画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标[/align]
[align=left] glRectf(-0.5f, -0.5f, 0.5f, 0.5f);[/align]
[align=left] //保证前面的OpenGL命令立即执行(而不是让它在缓冲区中等待)[/align]
[align=left] glFlush();[/align]
[align=left]}[/align]
[align=left]int main(int argc, char * argv[])[/align]
[align=left]{[/align]
[align=left] //对GLUT进行初始化[/align]
[align=left] glutInit(& argc , argv );[/align]
[align=left] //设置显示方式,GLUT_RGB表示使用RGB颜色、GLUT_INDEX表示使用索引颜色、GLUT_SINGLE表示使用单缓冲、GLUT_DOUBLE表示使用双缓冲[/align]
[align=left] glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE );[/align]
[align=left] //设置窗口在屏幕上的位置[/align]
[align=left] glutInitWindowPosition(100, 100);[/align]
[align=left] //设置窗口的大小[/align]
[align=left] glutInitWindowSize(400, 400);[/align]
[align=left] //根据前面设置的信息创建窗口,参数作为窗口的标题。注意:窗口创建后,并不立即显示在屏幕上。需要调用glutMainLoop才能看到窗口[/align]
[align=left] glutCreateWindow( "第一个OpenGL程序" );[/align]
[align=left] //当显示图画时,请调用myDisplay函数,于是没有myDisplay函数就用来画图[/align]
[align=left] glutDisplayFunc(&myDisplay);[/align]
[align=left] //进行一个消息循环[/align]
[align=left] glutMainLoop();[/align]
[align=left] return 0;[/align]

[align=left]}[/align]

[align=left](6)点击F5、编译通过,出现如下画面[/align]





二、编译过程中遇到如下问题如何解决
问题一、
错误 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的时候发现了这个问题,解决办法如下
第一步








第二步








第三步重启系统

问题四、
MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号
_main,该符号在函数 ___tmainCRTStart
无法解析的外部符号_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的方法:

右键点击-->项目,选择---->属性,属性页 窗口弹出;
接着,点击连接器->系统,在右侧会看到“子系统”选项,在这里可以选择相应的连接程序开关.





问题五安装安装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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: