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

一、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 argcchar * 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的时候发现了这个问题,解决办法如下
第一步


第二步



第三步重启系统

问题四、
  无法解析的外部符号_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)
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EGL, OpenGL和GSL是与图形编程相关的术语。EGL是嵌入式系统图形库,OpenGL是用于渲染2D和3D图形的图形API,GSL则是GNU科学库。它们之间的关系如下: EGL (Embedded-System Graphics Library) 是一个用于管理嵌入式系统图形显示和窗口系统的库。它提供了与底层图形驱动程序的接口,允许应用程序创建和管理图形表面。 OpenGL (Open Graphics Library) 是一个跨平台的图形API,用于渲染2D和3D图形。它定义了一套函数和命令,用于描述和操作图形对象,如点、线、三角形和纹理等。通过OpenGL,开发者可以利用硬件加速来实现高性能的图形渲染。 GSL (GNU Scientific Library) 是一个用于数值计算和科学计算的C和C++库。它提供了许多常用的数学函数和算法,包括线性代数、特殊函数、傅里叶变换、随机数生成等。 所以,EGL是一个图形库,用于管理嵌入式系统的图形显示和窗口系统;OpenGL是一个图形API,用于渲染2D和3D图形;而GSL是一个数值计算和科学计算的库。 : 参考资料提到,如果你在编译过程遇到了"Could NOT find OpenGL (missing: OPENGL_glx_LIBRARY)"的问题,你可以尝试重新安装libgl1-mesa-dev库来解决。你可以使用以下命令来重新安装该库:sudo apt-get install --reinstall libgl1-mesa-dev。 : 参考资料还提到,你也可以在你的CMakeLists.txt文件设置OpenGL_GL_PREFERENCE变量为"GLVND",以解决该问题。设置该变量后,CMake会使用GLVND(OpenGL Vendor-Neutral Dispatch)来选择OpenGL驱动程序。 综上所述,EGL是用于管理嵌入式系统图形显示和窗口系统的库,OpenGL是一个用于渲染2D和3D图形的图形API,GSL是一个用于数值计算和科学计算的库。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值