起因:
学习OpenGL,希望在codeblocks中配置GLFW和GLAD环境,运行opengl程序。而LearnOpenGL CN(链接) 使用的IDE是VS,按照其教程步骤模仿在codeblocks中配置还是遇到很多问题,然而网上要么使用的IDE为VS,要么不采用Cmake,而是自己去复制文件设置一个编译环境,因此,我把我遇到的问题和解决方式分享一下,希望能帮到你。
过程:
(鉴于LearnOpenGL CN有VS的教程,使用codeblocks其实大体操作过程相似,所以主体教程里的注意点还是要遵守,至于不同点,我先讲述下我的经历,再讲解决方法)
- 首先下载的GLFW source文件按教程方法通过cmake生成一个新文件夹(教程中叫build),新文件夹可以通过codeblocks编译(即build)生成静态链接库。【注意:新文件夹中并不像VS教程一样,在VS中静态链接库后缀为.lib,而在codeblocks中后缀为.a,其生成在src文件夹下(萌新的我,最开始在这里卡了很久,一度在编译器中调整build target,以及其他设置,以生成.lib)】
- 以上生成的.a静态链接库,按照教程推荐的第二种方法将其整合到一个新新文件夹中,作为自己第三方库的根目录。codeblocks 设置 setting compiler 中的Linker settings 中添加其新新文件夹中的.a文件,在search directories中将新新文件夹的includes和libs路径分别添加到相应地方,方便编译器寻找到第三方静态库。
- 将libopengl32.a也以同样的方式添加到你整合的新新文件夹,再添到Linker setting中。【而libopengl32.a在哪呢,我最开始在网上下了个2333,其实这个库在Mingw中的lib中有的,你可以搜索下Mingw文件夹】
- 【问题:理论上,教程到这就完成了,GLFW环境配置搞定了,但是当你编译时却发现libglfw3.a(win32_monitor.c.obj):win32_monitor.c:(.text+0x172): undefined reference to `__imp_CreateDCW’ 一系列此等undefined reference to的错误】【处理过程:可以发现其实当libglfw3.a不链接的时候,我们的glfwInit();直接无法识别,那么其实我链接的其实没啥问题,是libglfw3.a库中的函数找不到定义,说明可能缺少其他链接文件,我查询CreateDCW函数的库是什么,在网上找到是libgdi32.a,确实也有相似的错误是未添加此静态库导致的,但是并处理后并没有解决问题;发现函数中有__imp_前缀,再次找解决问题的库,网上有加libwinmm.a解决问题的,说是libglfw3.a在编译后会添上这个函数前缀导致找不到定义,VS默认解决此问题,我一度认为这就是最终解决方案了,但是在加入这个静态库后还是同样的错误】
- 【问题的解决:在Stack Overflow网站上浏览相同错误,找到一个错误相同的帖子(链接),但此贴楼主是同时使用了动态库和静态库造成错误,解决方法是干掉静态库。我也看了许多外网贴,在解决不了静态库情况下,我寻求动态库,如何生成动态库?此坑回到最开始的教程,cmake的生成文件即一排红色的那些,不要和教程一样默认,勾选share… IDE 进行build生成动态库,编译器设置链接,解决问题】
- 【last:可按教程源码,测试是否成功设置环境】
- 如果有时间可以再看看GLFW官网教程,感觉也能解决静态链接库的问题官方教程链接