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

【OpenGL 学习笔记】Nehe OpenGL + Visual Studio 2015 环境配置+ vs编译基础

2016-06-25 23:06 776 查看
前文:
http://blog.csdn.net/wly95/article/details/50838719
大概介绍了OpenGL库文件的下载,以及在visual studio 2015中的配置,并且调用了库中的一些函数试运行了一遍。

本章主要介绍OpenGL考古教程NEHE,在visual studio 2015中是如何生存的。

NEHE可以说是一个技术达人自己写的OpenGL的SDK或者说二级库,相比调用OpenGL最底层库的函数,nehe_sdk更加方便。

但是由于历史悠久,vc 6.0时代的许多遗留问题,放在vs2015中就是一个一个的坑,坑的我根本爬不起来。

准备工作,下载:
http://download.csdn.net/detail/wly95/9559568
==================vs编译基础=====================

想想还是先说这个吧。
http://blog.csdn.net/wly95/article/details/51321664
上文说了Linux系统中编译和链接的过程。

gcc就是一个编译器套件。

其实,在windows中程序的实现一样需要编译和链接。

只不过它的过程在visual studio中被一个绿色的播放键给包括了。

这让我们看不到整个程序的调试或者发布的过程。

就像一个黑箱子,结果只有成功和失败。

而且需要有大量的失败经验才知道,那些各种报错到底是个什么鬼。

打开OpenGL库文件,可以看到三种类型的文件:

*.h     头文件

*.lib    静态库文件

*.dll    动态链接库

通常情况下,头文件中包含的是各种函数的声明,库文件中是对应函数的定义。

头文件以c代码的形式保存,可以阅读,了解到各个函数的接口。

而库文件则是经过编译过后的二进制文件,无法阅读,因此我们只能调用库,不能修改库,因为它被封装了。

静态库:在链接阶段,会将编译的目标文件.obj 与引用到的库.lib 一起链接打包到可执行文件exe(也称为目标代码)中,程序运行时将不再需要该静态库。

因此最终链接成的可执行文件(.exe)体积较大。在Windows中一般以.lib为后缀名,在Linux中一般以.a为后缀名。

动态库:在链接阶段,动态库.dll并没有真正被连接到目标代码中,只是将这个动态库的声明链接到目标代码中(这样程序运行时才知道怎样使用这个动态库),动态库.dll依然是独立存在的,只有在程序运行是才会将.dll载入到内存中被程序调用。因此程序运行时必须要有这个动态库且放在正确的路径中。

因此最终链接成的可执行文件(.exe)体积较小。在Windows中一般以.dll为后缀名,在Linux中一般以.so为后缀名。

==========nehe_sdk在vs2015中的配置================

首先,新建一个空项目。

右键“源文件”添加“新建项”

将NeheOpenGL源代码中的example1复制进去。

“项目”==>>属性

将nehe_sdk中的src文件夹包含进目录,这样就可以在源文件中调用SDK中的头文件。



这样,编译就没有问题了。

由*.cpp和*.h产生一堆*.obj在找他们的*.lib进行链接,然而找不到。

因此接下来需要配置一下nehe的库。

同样选择项目==>>属性

把sdk文件中的bin目录添加进去,告诉项目从这个路径里找



那么要找什么呢??

把NeheGL.lib文件添加进去。



这样obj和lib就可以愉快地链接进exe了。

最后,由于上个世纪的遗留问题。nehe写的程序用的字符集为多字节字符集。因此要做如下修改:



在源代码中,有这样两个头文件:

#include <gl\gl.h>			// Header File For The OpenGL32 Library
#include <gl\glu.h>			// Header File For The GLu32 Library


替换为:

#include <gl/glew.h>		// 包含最新的gl.h,glu.h库
#include <gl/glut.h>		// 包含OpenGL实用库


因为上传文档中只有下面两个头文件对应的库。

也可以根据注释,找到对应的库文件,按照上述编辑链接器属性将库添加进项目。

=================问题汇总=====================

严重性 代码 说明 项目 文件 行 禁止显示状态

错误 LNK2019 无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用 Project4 c:\Users\wly\documents\visual studio 2015\Projects\Project4\Project4\MSVCRTD.lib(exe_main.obj) 1

项目类型选择错误。

解决方法:

属性>>链接器>>系统>>子系统>>WINDOWS

============================================

严重性 代码 说明 项目 文件 行 禁止显示状态

错误 LNK2019 无法解析的外部符号 _auxDIBImageLoadA@4,该符号在函数 "struct _AUX_RGBImageRec * __cdecl LoadBMP(char *)" (?LoadBMP@@YAPAU_AUX_RGBImageRec@@PAD@Z) 中被引用 NEHE_Tutorial_07 C:\Users\wly\documents\visual studio 2015\Projects\NEHE_Tutorial\Tutorial_07\main.obj 1

此问题出现在例程06《纹理映射》中,原因是没有添加GLAUX.H对应的库。

解决方法:

属性>>链接器>>常规>>附加库目录

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib

属性>>链接器>>输入>>附加依赖项

GLAUX.lib

============================================

严重性 代码
说明 项目 文件行
禁止显示状态

错误 LNK1120
2 个无法解析的外部命令 NEHE_Tutorial_07C:\Users\wly\documents\visual studio 2015\Projects\NEHE_Tutorial\Debug\NEHE_Tutorial_07.exe1

严重性 代码
说明 项目 文件行
禁止显示状态

错误 LNK2019
无法解析的外部符号 _sscanf,该符号在函数 _GetRegistrySysColors@8 中被引用NEHE_Tutorial_07
C:\Users\wly\documents\visual studio 2015\Projects\NEHE_Tutorial\Tutorial_07\GLAUX.lib(tk.obj)1

严重性 代码
说明 项目 文件行
禁止显示状态

错误 LNK2019
无法解析的外部符号 _vsprintf,该符号在函数 _PrintMessage 中被引用
NEHE_Tutorial_07 C:\Users\wly\documents\visual studio 2015\Projects\NEHE_Tutorial\Tutorial_07\GLAUX.lib(tk.obj)1

同样出现在例程06中,原因推测是vc6.0中库在vs中有了修改和更新,需要添加一个新的库。

解决方法:

在文件开头加上:

#pragma comment(lib, "legacy_stdio_definitions.lib")

legacy是“遗产”的意思,所以这个库应当是旧版本遗留下来的函数所需要的库文件。

===================小技巧======================

单个解决方案中可以建立多个项目。

(以前都是一个解决方案写一个helloworld就放一边了。。。)

右键解决方案,添加新建项目。

再按照开头方法简单配置一下,

调试的时候,右键项目,选择“调试”,启动新实例,即可。

如果多次调试,

右键项目,选择“设为启动项”

=============================================

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息