GLFW初体验
GLFW - 很遗憾,没有找到FW的确切含义,Wiki上没有,GLFW主页也没有。猜测F表示for,W表示Window
GLFW是干啥用的?
一个轻量级的,开源的,跨平台的library。支持OpenGL及OpenGL ES,用来管理窗口,读取输入,处理事件等。因为OpenGL没有窗口管理的功能,所以很多热心的人写了工具来支持这些功能,比如早期的glut,现在的freeglut等。那么GLFW有何优势呢?glut太老了,最后一个版本还是90年代的。freeglut完全兼容glut,算是glut的代替品,功能齐全,但是bug太多。稳定性也不好(不是我说的啊),GLFW应运而生。
如何使用GLFW
直接使用库文件
1. 到这里下载编译好的库文件
2. 解压后直接使用即可,详见后面配置。
自行编译源码
如果想提高B格,自行编译的话,可以按如下步骤进行。
1. 到这里下载GLFW
2. 到这里下载CMake
3. 参考这个页面进行编译
配置GLFW编程环境
1. 打开Visual Studio 2012,新建一个Console程序
2. 右键单击project选择properties,打开属性页面
3. 在VC++Directories-Include Directories中写入glfw的头文件目录,我这里是 ../glfw-3.0.4.bin.WIN32/include
4. 在VC++ Directories-Library Directory中写入glfw的库文件目录,我这里是 ../glfw-3.0.4.bin.WIN32/lib-msvc110
5. 在Linker - Input - Additional Dependencies中填入glfw3dll.lib
注意:如果使用静态链接,那么上面第五步中glfw3dll.lib应该换成glfw3.lib,并且在工程属性页面中C/C++ - Code Generation 将 Runtime Library 设置为 /Mt 或者 /Mtd
渲染三角形
配置好环境之后,开始进入正题,总得画点什么吧。 渲染三角形几乎是图形程序中的Hello world。代码如下,框架是从glfw首页copy过来的,绘制三角形的代码是我加上去的。
#include <GLFW/glfw3.h> int main(void)
{
GLFWwindow* window; /* Initialize the library */
if (!glfwInit())
return -; /* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(, , "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -;
} /* Make the window's context current */
glfwMakeContextCurrent(window); /* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Draw a triangle */
glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); // Red
glVertex3f(0.0, 1.0, 0.0); glColor3f(0.0, 1.0, 0.0); // Green
glVertex3f(-1.0, -1.0, 0.0); glColor3f(0.0, 0.0, 1.0); // Blue
glVertex3f(1.0, -1.0, 0.0); glEnd(); /* Swap front and back buffers */
glfwSwapBuffers(window); /* Poll for and process events */
glfwPollEvents();
} glfwTerminate();
return ;
}
代码很简单,看注释即可,无需多解释。如果一切正常,屏幕上会出现一个窗口,里面有一个五颜六色的三角形。

常见错误及解决办法
使用一个库无非包含三个步骤:
- 包含头文件
- 链接库文件
- 提供运行时dll文件
只要这三个步骤正确了,基本不会出问题。
错误一
1 error C1083: Cannot open include file: 'GLFW/glfw3.h': No such file or directory
2 IntelliSense: cannot open source file "GLFW/glfw3.h"
3 IntelliSense: identifier "GLFWwindow" is undefined
4 IntelliSense: identifier "window" is undefined
5 IntelliSense: identifier "glfwInit" is undefined
6 IntelliSense: identifier "glfwCreateWindow" is undefined
7 IntelliSense: identifier "NULL" is undefined
8 IntelliSense: identifier "glfwTerminate" is undefined
9 IntelliSense: identifier "glfwMakeContextCurrent" is undefined
10 IntelliSense: identifier "glfwWindowShouldClose" is undefined
11 IntelliSense: identifier "glfwSwapBuffers" is undefined
12 IntelliSense: identifier "glfwPollEvents" is undefined
13 IntelliSense: identifier "glfwTerminate" is undefine
这显然是头文件没有找到,导致下面所有glfw相关的类型都找不到定义。需要正确设置头文件的路径,注意只要包含到include目录一级即可,比如\glfw-3.0.4.bin.WIN32\include
错误二
Error 1 error LNK2019: unresolved external symbol _glfwInit referenced in function _main
Error 2 error LNK2019: unresolved external symbol _glfwTerminate referenced in function _main
Error 3 error LNK2019: unresolved external symbol _glfwCreateWindow referenced in function _main
Error 4 error LNK2019: unresolved external symbol _glfwWindowShouldClose referenced in function _main
Error 5 error LNK2019: unresolved external symbol _glfwPollEvents referenced in function _main
Error 6 error LNK2019: unresolved external symbol _glfwMakeContextCurrent referenced in function _main
Error 7 error LNK2019: unresolved external symbol _glfwSwapBuffers referenced in function _main
Error 8 error LNK1120: 7 unresolved externals
这个错误发生在链接阶段,说明是库文件(.lib)文件找不到,需要在项目的属性页面中设置lib文件,在Visual Studio中右键单击Project,选择Properties - Configuration Propterties - Linker - Input - Additional Dependencies,单击右侧的下三角进入编辑页面,将glfw3dll.lib加入其中即可。
注意:gflw提供了不同版本的库文件,如果你使用的是Visual Studio 2012,请使用lib-msvc110下面的库文件,如果是Visual Studio 2013,那么则需要使用lib-msvc120下面的库文件。lib文件有两个,一个是glfw3.lib,一个是glfw3dll.lib,前者是静态链接用的(链接此文件后,运行时无需dll文件,但是程序体积会变大),后者是动态链接用的(配合dll使用),不要搞混。
错误三
dll缺失,如下。

编译链接都没问题,运行时出现这个错误,很简单,使用的是动态链接,但是程序没有找到对应的dll文件,将glfw3.dll复制到程序所在目录即可,一般是Visual Studio的Debug或Release目录。
错误四
Error 1 error LNK2005: _free already defined in LIBCMT.lib(free.obj)
Error 2 error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
Error 4 error LNK1169: one or more multiply defined symbols foun
这是由于VS默认链接了LIBCMT.lib,只要将它禁止即可,在工程属性页面选择Linker - Input - Ignore Specific Library,点击右侧小箭头进行编辑,加入libcmt.lib即可。

==
GLFW初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
随机推荐
- eclipse中java项目的build path详解
BuildPath中只支持加入jar文件,具体方法如下:在eclips里在工程名上右键->build path->contigure bud path->java build pat ...
- python day1 变量的命名和赋值
变量 一.变量的命名 1.不能以数字进行开头 2.不能包含特殊字符 3.不能是python内部的某些关键字 a = 123print(a)123 --------------------------- ...
- 虚拟机上安装Linux操作系统
很久之前就知道虚拟机这个东西,也都在虚拟机上安装过Windows的操作系统和Linux的操作系统,但是一直都没有去做笔记. 最近还是比较有时间,就移除了前两天刚刚安装的Linux系统,重新安装一次,做 ...
- map容器的使用
1.map是STL容器中的一种,属于关联性容器.以key value的形式存储.key必须唯一.如果重复则插入失败.插入后按照key默认排序.必须要先声明命名空间:using namespace st ...
- 安装和配置Mantis<项目管理工具>
说明: 黑色加粗部分为配置文档修改或添加的内容,例如index.cgi意思为修改或添加index.cgi 红色加粗部分为操作控制而非直接输入,例如空格意思为此处需要按下空格键 一.介绍 Apache: ...
- js queue dequeue clearQueue stop
一.queue( [queueName ], newQueue ) 操作欲执行队列方法 第一个参数是队列名称,不写的话默认是fx 第二个参数可以是一个函数数组,存放所有队列函数,也可以是一个回掉函 ...
- angular中的 ng-change
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- Java数组与vector互转
Java数组与vector互转 /* Object[] object1 = null ; //数组定义 Vector<Object> object2;//Vector定义 object2 ...
- mac os 体验
苹果电脑和苹果手机不同,不需要苹果ID就可以使用. 之后依次安装xcode, visual studio code, flash player. eclipse 还没有安装成功.
- LinqToEntity模糊查询的方法选择
LinqToEntity针对oracle模糊查询 方法:Contains() 转换出来的sql是 like 关键字 方法:IndexOf() 转换出来的sql是 instr() 函数 lik ...