vs2017+OpenGL配置(glfw+glew、glfw+glad、glut三种环境)
准备工作
首先安装vs2017,安装的时候选择的是C++那个包(第一行右边那个,忘截图了。。。)
然后下载glfw和glad(可以用glfw+glew,glad比glew新且有前景),最老的是glut,比较轻量,但不适合大型工程,一般会被glfw所替代。
下载注意位数,此次用的都是32位的,vs2017属性设置的时候也要注意32位,调试的时候注意x86
一些体会:也在网上看了许多人的博客,写的很好,但综合之后发现自己缺少思考,应该从程序的运行模式来思考,从VS的工作模式上理解环境配置的话应该是有两种方法的(其他版本VS的文件引入模式应该也是这样):
- 从项目属性引入需要的文件
- 在VS文件夹中添加需要的文件
(有的人在VS中添加完文件之后,又再次从属性中进行了引入,其实是重复操作)
下面有这三种环境配置
- glfw+glew
- glfw+glad
- glut
前两种是从项目属性引入库和头文件,glut是直接添加文件,因为glfw的文件比较多,一时间可能会弄混,当然前两个环境也可以去添加文件,glut也可以从项目属性引入,都是可行的办法,但自己去尝试可能会出现的问题就要去自己解决了。
先说glfw+glew的配置:
1)创建一个空项目
2)修改项目属性
VC++中的包含目录修改:(把include文件夹加入)
VC++中的库目录修改:
链接器–>输入–>` 附加依赖项:添加
opengl32.lib
glfw3.lib
glew32s.lib
3)调试成功,但有警告:
“警告 LNK4098 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library BuildEnv F:\xxxx”
链接器–>忽略特定默认库:添加MSVCRT.lib
忽略掉这个库就不会有警告了
示例程序:
#include<iostream>
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW\glfw3.h>
using namespace std;
int main(int argc, char** argv[])
{
/*glewExperimental = GL_TRUE;
if (glewInit()!=GLEW_OK)
{
cout << "failed to initalize GLEW" << endl;
return -1;
}*/
glfwInit();//初始化
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//配置GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//配置GLFW
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr)
{
cout << "Failed to create GLFW window" << endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}
glfw+glad配置
http://glad.dav1d.de/
在线服务网站,gl选择3.3以上版本(3.3是可编程管线版本,更新的版本也能正常工作),语言为c/c++,Profile设置为core,插件不管就行,最后Generate并下载zip文件
解压glad的压缩包
glfw的配置和上面一样,需要把glad的include配到包含目录里,然后把glad目录中的src目录下的glad.c复制到项目的源文件夹下即可
示例程序:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
while (!glfwWindowShouldClose(window))
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
glut配置
无奈教材书上用的是glut,为了实验部分,不得不配。
先下载glut,包含以下几个文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDn4NTyV-1570705098762)(en-resource://database/4156:1)]
使用的时候要引入glut.h,函数也要用lib中的函数,系统也要用glut的dll配置文件。
先说一个和上面两个不一样的配置方法:
glut.h放在D:\Microsoft\VisualStudio\VC\Tools\MSVC\14.16.27023\include文件夹中,在程序中include的时候可以直接#include<glut.h>,也有人会在include文件夹中创建一个gl文件夹来放置glut.h,这样的话程序要写成#include<gl/glut.h>,这个根据个人习惯了,我直接放在了include中。
glut32.lib放在D:\Microsoft\VisualStudio\VC\Tools\MSVC\14.16.27023\lib\x86文件夹中,因为x86架构是32位的,我编程调试的时候用的也是x86,所以一般都用glut32.lib。
glut.lib应该是用于64位程序或系统,使用的话放在D:\Microsoft\VisualStudio\VC\Tools\MSVC\14.16.27023\lib\x64文件夹中.
dll文件的话可能会有点小问题,一般来说glut32.dll放在C:\Windows\System32中,glut.dll是放在C:\Windows\SysWOW64中,用的程序用的是x86进行的调试,然后就报错失败了,在尝试把glut32.dll放入C:\Windows\SysWOW64中之后调试成功了,可能是系统对配置文件的调用问题,这里出现问题的话可以尝试更改dll文件的放置位置
以上是glut的x86调试,对于x64的调试又会出现新的问题,试了一下x64调试,系统在x64模式下也寻找glut32.lib来运行程序,而且不管用哪一个lib文件都会这样的报错:
LNK4272 库计算机类型“x86”与目标计算机类型“x64”冲突
Project2
D:\Microsoft\VisualStudio\VC\Tools\MSVC\14.16.27023\lib\x64\glut32.lib
目前只用了x86调试程序,就先解决这些问题吧
如开头所述,glut配置也可以从项目属性去添加文件,可以尝试一下,不过出了问题就又要麻烦了。。。