opengl在windows下默认是很低的版本,需要自己更新驱动,驱动之中含有最新的函数。Opengl是一个协议,就是实现一些函数。对不同版本,在管程、渲染的方面有和你打的区别。这个要结合第一点。
1 实验环境搭配
环境搭配具体做什么?下载库,其实就是三个文件,动态库文件,静态库文件和头文件,把他们分别拷贝到某些目录下即可,再去学习怎么在代码中引用库,静态文件和#include头文件类似,VS要加#pragma comment(lib,”path”)要引用外接静态库。嗯,就是酱紫。很简单。
1.1 什么是动态库,静态库?
动态库:程序运行的时候加载,在编译的时候用不着,放在C:\windows目录下或.exe所在目录的,哪个优先级更好就不知道了,我觉得是当前目录容易,同一类文件放在比较近的地方,内存的就近原则
静态库: 编译的时候要用到,比如你需要调用某个函数 ,有点像是头文件,要重新编译,所以对比动态库编译的时间会长一些。默认目录是放在安装VS\VC\lib目录下。
头文件:默认目录是放在安装VS\VC\lib目录下。
以上三个库的路径都是可以指定的。具体是按VS-属性-链接里的额外库路径。这里也可以添加库。
静态库可以用#pragma comment(lib “path”); 这里不同库之间若是有依赖顺序很重要。
1.2 实例分析 VS2015 配置opengl的一些库
(T T 第一次在VS配置,花了10+小时,学到的还是有的)
我的平台是VS2015,所谓环境配置就是将要引用的外界库通过某种方式让编译器能知道你要用这个库。然后是头文件,opengl的操作很多封装在库里。
库就是别人写好的算法/功能,提供一个接口,就是函数头给你,那么为什么你写 。
网上下载一个库,选择平台后一般有两种方式,源码和带编译好的包。因为源码下载下载后编译,最终目的也是得到动态静态库。下面讲怎么处理这两个库。
不同的库之间的依赖,如果两个库之间有依赖,那么要统一同种版本,比如release版本等,因为不同的发行版支持的函数是不同的
如果在代码里写了#pragma的顺序,在属性对话框又写了另一种顺序,我的电脑上会属性对话框里的顺序,这个是个好问题,?我猜是编译器先编译源程序然后再链接库,但是如果还没链接库就编译,会不会有未定义之类的行为,或者说二者是同时的,即include的思想,用到的时候去库里找函数。
要安装的库:
支持高版本opengl的glew库
对窗口状态操作的glfw(可作为glut的替换,glut太旧,一直没有更新)
矩阵等数学函数库 glm,全都是头文件,不用库,很小巧
加载图片 FreeImage
读取不同格式的图片数据 assimp ,这个库的配置稍繁琐了
具体做法见1.1,这里讲代码里怎么做?
代码中#pragma common (lib , “path/.lib” ) 引用静态库。Include加头文件。
听起来很简单的样子。。。
可能出现的错误
# 文件目录找不到,去加目录
#pragma common (lib , “glew32.lib” ) 需要引用动态库,而glew32s.lib则不同。
# 由于glew放在最前面,因为其他的函数库可能会被替换/覆盖,或者其库文件中引用了glew库的函数。可能出现undefine某个函数的错误代码。
# [email protected] 函数未定义,重复定义,库之间来关系,可以尝试把顺序呢调换一下
# 如果库之间有依赖,目前我知道的只有两种,重复定义函数变量的,这个两个库搞一起我,我觉得只能重新编译吧,在文件里加一个条件编译。第二是A库里某个函数引用了B库的函数,那么要先有B再引用A,我配置的问题这个出错一大批,组合加逻辑启发式检查吧T T。
库之间有依赖是非常纠结的问题了,编译器报错很多时候会出现不着边际的提示,如果网上查得到库之间有依赖,那还好,但是,有依赖也不给你搜索!因为库是已经编译好了,难查看,只是检测。
重新编译库的例子
Assimp库直接下载下来的是VS06 VS08的,如果是以上版本,.lib .dll是没用的,见官网。
所以我们下载源码编译。以assimp-3.1.1为例。
需要下载的
- assimp-3.1.1.zip包或git下来,打开后有include目录的头文件可以用。
- DirectX SDK 下载,安装
- cmake ,assimp里一批的makefile。。
步骤:
先安装cmake,Direcx,解压.zip得到assimp-3.1.1目录
打开cmake GUI (命令行也可以,教程见官网),将assimp-3.1.1添加进源目录,生成结果你看着办,最后我们生成的文件就在这里,我设置的是在assimp-3.1.1\output目录,output是我刚创建的
点击开始confiure
注意:有两个主要会出现的,
一是找不到Directx,没有安装,装上就好了。
二是zlib可能会出问题,提示是makefilelist第四行project(zlib C)会将project。
zlib在contrib(第三方库)目录下,打开zlib,编辑makefilelist 将project(zlib C)替换成以下代码。
cmake_policy(PUSH)
if(CMAKE_MAJOR_VERSION GREATER 2)
cmake_policy(SET CMP0048 OLD)
endif()
project(zlib C)
cmake_policy(POP)
set(VERSION "1.2.8")