序
计算机图形学_中国大学MOOC(慕课) (icourse163.org)
看来,这是两个实验
实验1是配置环境,2是用给的代码run一下
照着给的文档搞吧……凑凑热闹,计算机小白一个,能力有限
安装VS
首先,得安装VS……又麻烦了
现在,是2022年,如何下载过去的VS?
(32条消息) 在微软官网下载旧版本的Visual Studio_bendaxi的博客-优快云博客_vs怎么下载旧版本
好像,谁说VS多少以前是32位软件,用不了4GB以外的内存?忘了……就2019吧。
Downloads - Visual Studio Subscriptions Portal
安装教程
(32条消息) vs2019的下载及安装教程_空弦的编程小屋的博客-优快云博客_vs2019
C++,能装在D盘吗?C盘放不下啊,8个G
还是默认吧……反正都是一个硬盘……
总觉得C盘要挂了

漫长的安装。
你好,世界
目前看C盘还行,以后呢?不知道了。

GLAD与GLFW的配置
这个实验,用的是GLAD+GLFW
简单介绍
首先,我得知道我配置的是什么
我原来只用过freeglut,其他的啥都不知道
通常来说
glad和glfw配合使用,比如我上面发的那个网站就是。
glew和Freeglut配合使用,比如OpenGL红宝书上面的例子。
glad与glew作用相同,可以看作它的升级版。
来源:
简单来说,GLFW 是对之前固定管线常用的 GLUT 的一种改进
来源:
实验任务书
freeglut与GLFW不同
它们之间最大的区别是,在处理用户输入上,freeglut主要通过回调函数(Callback function),而GLFW则提供了两种输入机制即回调函数与轮询(polling)。在回调函数方式 中,用户提供给GLFW的回调函数用来处理用户输入操作如键盘按键或鼠标操作。当用户按下或者松开按键时,它都会被触发,包括一些特殊的键位(例如 Shift、Caps Lock、Esc等)。而在轮询方式中,程序可以直接查询系统中是否已经按下了任意键,或者更具体一点,是否按下了某个特定的键。它允许用户直接获取某个按键的瞬时状态,相当于用户直接询问:“这个键现在被按下了吗?”
回调函数与轮询这两种方式的最大差别,轮询方式能连续获得键盘输入,而回调函数则适用于按键速度不是特别快,不需要连续效果(比如人物不停地跑),具体可参考文[5]。另外,freeglut支持创建右键菜单,而GLFW不支持。
GLFW在输入机制上提供了更多选择,同时也增加了复杂性。而freeglut则相对较为简单,因此如果从学习OpenGL与图形学的角度来看,freeglut不失为一个合适的选择。而如果对程序的连续性输入要求较高时,则可以考虑GLFW。
来源:
大概知道了,那末,开始配置吧,试一试。
这有个相关的视频
【现代OpenGL学习分享】 0-开始你的OpenGL,GLAD与GLFW的配置介绍_哔哩哔哩_bilibili
GLFW的配置
下载
根据猜测,首先,应该得下载这个叫GLFW的东西吧。
没找到源码,只找到了编译好的,就这样吧……
下载了编译好的,32位的,为什么是32位的?因为这个任务书里让的。
下完了里面是这个:


唉……一直都没搞清楚,h、dll、lib,都是啥区别。那就去搞清楚吧。
h+lib+dll
这几个文件,我记得好像和编译,链接,运行有关;那末,什么是编译,链接,运行?
这是个大概的介绍:
引用:
这个更具体了一点:
- 整个流程,5个阶段
- 5个阶段的具体介绍
预处理(Preprocessing)
翻译一段 C 语言程序的第一步是预处理。这一步主要处理所有以“#”号开头的行。比如当我们遇到
#include "header.h"的时候,就直接把header.h文件里的所有内容插入到这儿。【引号引的头文件,好像是自己写的那种头文件?】由此可见,一段 C 语言程序经过预处理之后还是一段 C 语言程序。编译(Compilation)
第二步是编译,也就是将一段 C 语言程序翻译为一段汇编语言程序。汇编语言比 C 语言要底层多了,基本上就是机器指令的文字版,每一行汇编语言对应着一条机器指令。往往 C 语言程序里的一行要被翻译成好几行汇编语言程序才行。不同的高级语言(如 C、Fortran、Pascal 等等)有不同的预处理器和编译器,但它们在经过编译之后都变成了同一种汇编语言,于是后面的步骤和工具大家都是通用的了。
汇编(Assembly)
第三步是汇编,即把文字版的汇编语言程序真正翻译成由 0 和 1 组成的机器指令,并把它们打包输出成一个 relocatable object program(下文简称目标文件)。如果说汇编语言程序人类还勉强能看懂,经过这一步之后得到的目标文件就真的是一堆二进制乱码了。
链接(Linking)
第四步是链接,用来把多个目标文件合并成一个可执行文件。比如说我们写了一个 hello world 程序,其中调用了 C 语言标准库里的 printf() 函数来打印。我们的 hello world 的主函数和 printf() 函数存放在两个不同的目标文件里,经过这一步之后它们就被合并到一起了。(这里讲的是静态链接。如果是动态链接的话,printf() 在这一步暂时不合并进来,而是在下一步程序运行的时候才被加载。)
加载(Loading)
上一步所生成的可执行文件终于可以被操作系统加载运行了。操作系统会将这个可执行文件中的代码和数据从磁盘复制到内存中,并跳转到该程序的第一条指令处(也叫做入口点,entry point)开始执行。
引用:
差不多了,回到那三个文件吧
这是一个关于DLL的视频介绍
![]()
引用:
这个把lib介绍的比较清楚:
.h用于编译阶段的审核,如在math.h中有函数声明:
int abs(int);
但是在使用中写为
#include <math.h>
...abs(3,5);
编译器阶段就会检测出错误。
.dll用于运行阶段,如调用SetWindowText()函数等,需要在user32.dll中找到该函数。DLL可以简单认为是一种包含供别人调用的函数和资源的可执行文件。——【SetWindowText()函数在user32.dll中】
.lib用于链接阶段,在链接各部分目标文件(通常为.obj)到可执行文件(通常为.exe)过程中,需要在.lib文件中查找动态调用函数(一般为DLL中的函数)的地址信息,此时需要在lib文件中查找,如查找SetWindowText()函数的地址偏移【offset,有计算机内味儿了】就需要查找user32.lib文件。(.lib也可用于静态链接的内嵌代码)引用:
这个相当于总结吧
.h .lib .dll三者的关系是:
H文件作用是:声明函数接口
DLL文件作用是: 函数可执行代码
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
例如配置opencv时候:要在属性表里添加包含目录(头文件),库目录(dll),连接器里的附加依赖项(lib)
当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?
(动态链接库 lib+dll)这就是LIB文件的作用: 告诉链接器 调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项 .LIB文件,它起到桥梁的作用。
(静态连接库 只有lib)如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中
引用:
(33条消息) .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分__yuan_的博客-优快云博客
这还有个视频,介绍lib和dll的,不长,挺简洁的。
lib是个桥梁:
引用:
C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.cc中。编译之后,*.cpp,*.cc,*.c会被打包成一个.lib文件,这样可以保护源代码
(33条消息) 在VS工程中,添加c/c++工程中外部头文件(.h),lib库,dll库的基本步骤_芝士不知世的博客-优快云博客_添加vcxproj 真的?
还有个类似的:
为什么下载的安装包都需要安装才能用,而不是可以直接用呢,安装的过程到底是在做什么? - 淹死的鱼的回答 - 知乎 https://www.zhihu.com/question/265996364/answer/2378739425
大概知道了,接着配环境吧。
VS设置与3种文件
这个说有两种方法
由于VS历史问题,配置静态库有两个效果一样的方法C/C++和VC++
C/C++: Additional Include Directories
1.头文件(.h)
添加:工程-->属性-->配置属性-->c/c++-->常规-->附加包含目录(Additional Include Directories):加上头文件存放目录。
使用:在使用代码处引用这个头文件,#include "xxx.h"
2.静态库(.lib)
添加分两步:(1)添加文件引用的lib静态库路径:工程-->属性-->配置属性-->链接器-->常规-->附加库目录(Additional Library Directory):加上lib文件存放目录。
(2)工程-->属性-->配置属性-->链接器-->输入-->附加依赖项(Additional Dependencies):加上lib文件名。
另外还可以通过代码添加:
#pragma comment(lib,"文件路径/文件名")
3.动态库(.dll )
添加两种方式:一、把引用的dll放到工程的可执行文件所在的目录(DeBug\Release文件夹)下,如不添加,编译连接不会报错,运行报错:无法找到***.dll文件。
二、工程-->属性-->配置属性-->调试-->环境:PATH=dll所在路径
VC++ Directories: Include Directories 【实验指导书里好像就是这么做的】
1.头文件(.h)
添加:工程-->属性-->配置属性-->VC++目录-->包含目录:加上头文件存放目录。2.静态库(.lib)
添加分两步:(1)添加文件引用的lib静态库路径:工程-->属性-->配置属性-->VC++目录-->库目录:加上lib文件存放目录。
(2)工程-->属性-->配置属性-->链接器-->输入-->附加依赖项(Additional Dependencies):加上lib文件名。
引用:
这个也说有两种方法,就是不知道和上面的那个历史遗留的两种,是不是一个东西
VC++目录 ——>包含目录,对所有的项目及未来新建的项目都有效 【这么神的吗?】
c/c++——>常规——>附加包含目录,仅对当前项目有效
绝对路径设置方法:
在VS工程中,添加c/c++工程中外部头文件及库的基本步骤:1.添加工程的头文件(.h)目录:工程--属性--配置属性--c/c++--常规--附加包含目录:
添加头文件存放目录
2.添加文件引用的lib静态库路径:
1)工程--属性--配置属性--链接器--常规--附加库目录:加上lib文件存放目录。
2)然后添加工程引用的lib文件名:工程--属性配置属性--链接器--输入--附加依赖项:加上lib文件名
例如我的工程需要用的是:libmatio.lib;hdf5.lib;szip.lib;zlib.lib;
3.添加工程引用的dll动态库:把引用的dll放到工程的可执行文件所在的目录下(Debug目录)
注意:release版本和debug版本的区分,每种版本的设置都是独立的,要分别设置。
引用:
(33条消息) 在VS工程中,添加c/c++工程中外部头文件(.h),lib库,dll库的基本步骤_芝士不知世的博客-优快云博客_添加vcxproj
这个说设置附加依赖项是为了少写一句comment lib
引用:
这个也说设置附加依赖项是为了少写一句comment lib
引用:
这俩都这么说,那就这么认为吧。
环境配置
上面说了一大堆,也不知道到底怎么搞。
先按给的文档来……文档不清楚就参考前面提到的那个视频
【现代OpenGL学习分享】 0-开始你的OpenGL,GLAD与GLFW的配置介绍_哔哩哔哩_bilibili
再不行再参考前面那一堆……
包含目录——include.h

库目录——lib
附加依赖项,是为了少写一句comment,lib

那两个文件路径里具体是这个:

是静态库不是动态库?
H和LIB都有了,但是,没搞DLL啊?它怎么知道DLL在哪里的?默认和LIB在一起?实验指导书里压根就没提DLL……
试了一下,删了DLL,也能正常运行……
先这样吧……
查了查官网

所以,猜测——这个lib好像是静态库,所以不用DLL的。
在这个链接里,给出了更具体的解释:
配置——直接下载binary
点击32-bit Windows binaries进行下载(可能上不了,这时可以尝试刷新),这时浏览器下面会弹出下载提示。
下载之后,解压压缩包,得到的文件夹应如下:
选择适合自己编译器的库,将文件夹里的glfw3.dll、glfw3.lib和glfw3dll.lib拷贝到一个新文件夹,例如D:\libs\。使用时可以只使用glfw3.dll(静态链接),也可以使用glfw3dll.lib和glfw3.dll(动态链接)。
引用:
看来猜的和事实差不多……
先这么理解吧。
还是python的环境好搞,直接pip……
GLAD的配置
从这里下载
按指导书设置,下载了一个这个

然后照着指导书include,复制.c文件,等等。
运行结果
虽然看不懂代码,但是,至少环境可用。
环境配置教程
这个视频,它为什么在第8章……
早点看到,也就没有前面那么多事了……
https://www.icourse163.org/learn/HUST-1003636001?tid=1467942455#/learn/content?type=detail&id=1249558437&cid=1277098767















7818

被折叠的 条评论
为什么被折叠?



