vc如何编译链接opengl库
强烈推荐的一篇强大的OpenGl学习博文OpenGL入门学习
vc2012如何链接opengl库?
首先,我们需要下载opengl的库文件,http://pan.baidu.com/s/1kTsjkZP
找到vc2012的安装路径
.h文件扔到\VC\include中。
.lib文件扔到\VC\lib中。
.dll文件扔到 c:\windows\system32中。
接着,我们用VS2012建立C++的Win32控制台应用程序,其中选中空项目后,点击完成即可。当我们建好项目后,就可以开始编程了。
GLUT教程
在这个部分我们将在我们的程序里建立一个main函数,这个main函数将完成必须的初始化和开启事件处理循环。所有的GLUT函数都有glut前缀并且那些完成一些初始化的函数有glutInit前缀。你首先要做的是调用函数glutInit()。 Void glutInit(int*argc,char**argv); 参数: Argc:一个指针,指向从main()函数传递过来的没更改的argc变量。 Argv:一个指针,指向从main()函数传递过来的没更改的argv变量。 在初始化GLUT后,我们开始定义我们的窗口。首先确定窗口位置(它默认的是屏幕左上角),我们使用函数glutInitWindowPosition()。 Void glutInitWindowPositon(int x,int y); 参数: X: 距离屏幕左边的像素数。-1是默认值,意思就是由窗口管理程序决定窗口出现在哪里。如果不使用默认值,那你就自己设置一个值。 Y:距离屏幕上边的像素数。和X一样。 注意,参数仅仅是对窗口管理程序的一个建议。尽管你精心的设置了窗口位置,window返回的可能是不同的位置。如果你设置了,一般会得到你想要的结果。接下来我们设置窗口大小,使用函数glutInitWindowSize()。 Void glutInitWindowSize(int width,int height); 参数: Width:窗口的宽度。 Height:窗口的高度。 同样width,height也只是一个参考数字。避免使用负数。 接下来。你应该使用函数glutInitDisplayMode()定义显示方式。 Void glutInitDisplayMode(unsighed int mode) 参数: Mode――可以指定下列显示模式 Mode参数是一个GLUT库里预定义的可能的布尔组合。你使用mode去指定颜色模式,数量和缓冲区类型。 指定颜色模式的预定义常量有: 1:GLUT_RGBA或者GLUT_RGB。指定一个RGBA窗口,这是一个默认的颜色模式。 2:GLUT_INDEX。指定颜色索引模式。 这个显示模式还允许你选择单缓冲区或双缓冲区窗口。 1:GLUT_SINGLE.单缓冲区窗口。 2:GLUT_BUFFER.双缓冲区窗口,这是产生流畅动画必须选的。 还可以指定更多,如果你想指定一组特殊的缓冲的话,用下面的变量: 1:GLUT_ACCUM.累积缓冲区。 2:GLUT_STENCIL.模板缓冲区。 3:GLUT_DEPTH.深度缓冲区。 假定你想要一个有单缓冲区,深度缓冲区的RGB窗口,你用“或“(|)操作符来建立你想要的显示模式。 ……………. glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE|GLUT|DEPTH); ……………. 经过上面的这些步骤后,就可以调用函数glutCreateWindow()来创建窗口了。 Int glutCreateWindow(char* title); 参数: Title:设置窗口的标题。 glutCreateWindow()的返回值是一个窗口标识符。后面你可以在GLUT里使用这个标识符,不过这个超出了本小节的范围。 现在就有一些代码来完成所有的初始化操作。 #include<gl/glut.h> void main(int argc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DEPTH|GLUT_SINGLE|GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow(“GLUT Tutorial”); } 如果你运行上述代码,你将会得到一个空的黑的控制台窗口,而没有OpenGL窗口。并且控制台窗口将很快消失。 在我们渲染一些东西前,还有两件事需要处理。第一告诉GLUT哪个函数负责渲染。我们创建一个简单的渲染的函数。下面的这个函数将会清除颜色缓冲区并画一个三角形。 ...
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd();
glFlush();
}
上面的函数的名字你可以自己取一个。现在你必须告诉GLUT使用我们上面的函数来进行渲染。这个叫寄存回调。。让我们告诉GLUT这个函数renderScene应该被使用。当需要重画的时候GLUT有一个只传递一个函数名称参数的函数(以函数名为形参的函数)就会被调用。
void glutDisplayFunc(void (*func)(void)); 参数: func: 当窗口需要被重绘是调用的函数的名称。注意使用NULL作为实参是错误的。 最后一件事是告诉GLUT我们准备进入应用程序事件处理循环。GLUT提供了一个函数让程序进入一个永不结束的循环。一直等待处理下一个事件。函数是glutMainLoop()。 void glutMainLoop(void) 到目前为止所有的代码都列在下面。如果你运行代码,将会得到一个控制台窗口,和一个画着一个白色三角形的OpenGL窗口,出现在你设置的位置,并有着你设置的尺寸。
#include <GL/glut.h> void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd();
glFlush();
} void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("3D Tech- GLUT Tutorial");
glutDisplayFunc(renderScene);
glutMainLoop();
}
当我们编译发生以下错误时:
错误 1 error LNK2019: 无法解析的外部符号 __imp____glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用
错误 2 error LNK2019: 无法解析的外部符号 __imp____glutCreateWindowWithExit@8,该符号在函数 _glutCreateWindow_ATEXIT_HACK@4 中被引用
错误 3 error LNK1120: 2 个无法解析的外部命令
网络上最有效的解决方式:
刚好在#include<gl/glut.h>之前加上
#define GLUT_DISABLE_ATEXIT_HACK
如果我们选用的是C++的Win32项目,其中选程序类型选择Windows 应用程序,并且发生以下的编译报错:
无法解析的外部符号 __imp____glutCreateMenuWithExit@8:
Win32 项目中应用程序的入口函数为 WinMain (窗口应用程序的主函数).而 Win32控制台应用程序的入口函数为 main 函数,也就是普通的命令行应用程序的主函数。
所以在 Win32项目中, 没有写 WinMain 函数实现就会出现链接错误了。同样在 Win32 控制台应用程序中, 没有写 main 函数的实现也会出现连接错误一样。
我们需要写函数:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
这个作为应用程序的入口函数(相当于控制台程序的main函数)
错误 1 error LNK1168: 无法打开 C:\Users\yejinru\Desktop\计算机图形学\Debug\计算机图形学.exe 进行写入 C:\Users\yejinru\Desktop\计算机图形学\计算机图形学\LINK 计算机图形学
遇到这种情况时,需要在任务管理器中手动把运行着的exe结束任务或者把项目暂停运行。
借别人的代码一用。。。原地址在:http://www.cppblog.com/wicbnu/archive/2010/09/30/128123.aspx
//#pragma comment(lib, "OpenGL32.lib")
//#pragma comment(lib, "GLU32.lib")
//#pragma comment(linker, "/subsystem:console") #include "stdafx.h"
#include <windows.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <GL/glaux.h> #define GLUT_DISABLE_ATEXIT_HACK
#include <GL/glut.h> #include <iostream>
#include <cstring>
#include <cstdio> void background(void){ //设置背景颜色为黑色
glClearColor(0.0,0.0,0.0,0.0); } void myDisplay(void){ //buffer设置为颜色可写 glClear(GL_COLOR_BUFFER_BIT); //开始画三角形 glBegin(GL_TRIANGLES); //设置为光滑明暗模式 glShadeModel(GL_SMOOTH); //设置第一个顶点为红色 glColor3f(1.0,0.0,0.0); //设置第一个顶点的坐标为(-1.0,-1.0) glVertex2f(-1.0,-1.0); //设置第二个顶点为绿色 glColor3f(0.0,1.0,0.0); //设置第二个顶点的坐标为(0.0,-1.0) glVertex2f(0.0,-1.0); //设置第三个顶点为蓝色 glColor3f(0.0,0.0,1.0); //设置第三个顶点的坐标为(-0.5,1.0) glVertex2f(-0.5,1.0); //三角形结束 glEnd(); //强制OpenGL函数在有限时间内运行 glFlush(); } void myReshape(GLsizei w,GLsizei h){ glViewport(0,0,w,h); //设置视口 glMatrixMode(GL_PROJECTION); //指明当前矩阵为GL_PROJECTION glLoadIdentity(); //将当前矩阵置换为单位阵 if(w <= h) gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w); //定义二维正视投影矩阵 else gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5); glMatrixMode(GL_MODELVIEW); //指明当前矩阵为GL_MODELVIEW } int main(int argc, char* argv[]){ // 初始化 glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(200,200); //创建窗口 glutCreateWindow("Triangle"); //绘制与显示 background(); glutReshapeFunc(myReshape); glutDisplayFunc(myDisplay); glutMainLoop(); return(0); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow){
char* argv[20] = {"a.bmp"}; main(1,argv);
return 0;
}
vc如何编译链接opengl库的更多相关文章
- 在 MacOS 上编译链接 OpenGL 程序
几个星期以前开始折腾在我的MBA上写 OpenGL 小程序.我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接.网上查了一下,MacOS上的Open ...
- linux下 GCC编译链接静态库&动态库
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...
- Linux程序编译链接动态库版本号的问题
不同版本号的动态库可能会不兼容,假设程序在编译时指定动态库是某个低版本号.执行是用的一个高版本号,可能会导致无法执行. Linux上对动态库的命名採用libxxx.so.a.b.c的格式.当中a代表大 ...
- 配置自己的OpenGL库,glew、freeglut库编译,库冲突解决(附OpenGL Demo程序)
平台:Windows7,Visual C++ 2010 1. 引言 实验室的一个项目,用到OpenGL进行实时绘制,还用到一些其他的库,一个困扰我很久的问题就是编译时遇到的各种符号未定义,符号重定义之 ...
- Linux环境下的编译,链接与库的使用
参考博客: http://www.cnblogs.com/qytan36/archive/2010/05/25/1743955.html http://m.blog.csdn.net/article/ ...
- Makefile 编译动态库文件及链接动态库
本文为原创文章,转载请指明该文链接 文件目录结构如下 dynamiclibapp.c Makefile comm/inc/apue.h comm/errorhandle.c dynamiclib/Ma ...
- Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)
Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可.如果没有安装,可以采取自己编译的方式.在Qt的源码包的q ...
- 【转】Linux编译链接问题----静态库和动态库
Linux静态库和动态库的命名规则 静态函数库 静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中. a) 优点: 编译后,可执行文件不 ...
- ubuntu 下 数学库编译链接时找不到各种数学问题解决方法 can not fon atan 等等
解决参考 http://askubuntu.com/questions/190246/ld-cannot-find-math-library you should use -lm at the end ...
随机推荐
- Castle IOC容器内幕故事(上)
主要内容 1.WindsorContainer分析 2.MicroKernel分析 3.注册组件流程 一.WindsorContainer分析 WindsorContainer是Castle的IOC容 ...
- socat : Some useful commands
http://technostuff.blogspot.com/2008/10/some-useful-socat-commands.html MONDAY, OCTOBER 6, 2008 Some ...
- HttpRequest类
一.HttpRequest的作用 HttpRequest的作用是令到Asp.net能够读取客户端发送HTTP值.比如表单.URL.Cookie传递过来的参数. 返回字符串的那些值就不说了,那些基本上都 ...
- C++在堆上申请和释放内存 - new & delete
// 动态申请内存, 指向一个未初始化的整型 int *pi = new int; // pi指向一个整型值,初始化为0 int *pi = new int(); // value of i is 1 ...
- C# 利用WORD模板和标签(bookmark) 批量生成WORD
前言: 由于对C#操作WORD不熟悉,也就留下这么一篇水文,别吐糟...=_=||| 利用Microsoft.Office.Interop.Word (2003版也就11版)——因为部分客户端还是用O ...
- 【转】Delphi多线程学习(9):多线程数据库查询(ADO)
原文:http://www.cnblogs.com/djcsch2001/articles/2382559.html ADO多线程数据库查询通常会出现3个问题: 1.CoInitialize 没有调用 ...
- Grunt打造前端自动化工作流
HTML去掉注析.换行符 - HtmlMin CSS文件压缩合并 – CssMinify JS代码风格检查 – JsHint JS代码压缩 – Uglyfy image压缩 - imagemin ht ...
- Android:布局实例之模仿微信Tab
微信Tab预览效果: 思路: 1.用TabHost+RadioGroup搭建基本布局,以RadioGroup代替TabWidget 2.设置按钮和文字的的样式和selector 3.创建相应的Acti ...
- Mac上如何修改默认打开方式
1.找到要打开的文件 2.右键显示简介 3.选择默认程序
- what is docker
尽管之前久闻Docker的大名了,但是天资愚钝,对其到底是个啥东西一直摸不清,最近花了一段时间整理了一下,算是整理出一点头绪来. 官网的介绍是这样的: Docker is an open platfo ...