仓库使用流程:
这个问题是我在学习制作小玩意的时候发现的问题,大致的流程是:
1.在Github上fork了截止2024.3.3日最新的GLFW仓库
2.在Github上直接为已Fork的GLFW仓库上传一个premake 文件
3.上传完毕后,将该仓库add submodule 下来到本地
熟悉的兄弟们已经看出来了,没错,这是Cherno的教程。(Window Abstraction and GLFW)
那么在“窗口抽象和GLFW“”这一集相信很多人都信心满满的坚持到最后一步,可惜遇到这个完全让人没有思路的问题(更重要的是来自输出窗口,完全看不明白啊喂)
发现并分析问题:
于是我开始分析:(等不及可以直接看最终解决方法)
首先,代码近乎是差不多的,所以这里应该没有问题。
参考了博客园上一位博主的文章(https://www.cnblogs.com/zhangyi1357/p/16078602.html)这和我最初的想法不约而同:即前后相差了很久的时间,应该是GLFW更新的版本问题。
但与该博主不同的是,他Fork的是Cherno的GLFW仓库,而我Fork的是官方的GLFW仓库,而且是最新的那个。
所以他提出了应该在premake5.lua文件中做systemversion:latest这个Cherno视频中提出的更改时,我是有些诧异的,但是他做到了正常运行,我猜想可能只是与Cherno对其库的premake文件修改有关,天时地利人和故他成功了。
而我与其有些差别,于是我开始搜索,并没有进展,因为似乎以“复刻Cherno 11 集程序遇到的困难”这样的关键词几乎没有能得到的结果。
我便开始以输入框中的报错问题入手:
中文:
error LNK2019: 无法解析的外部符号 _glfwSelectPlatform,函数 glfwInit 中引用了该符号
英文:
GLFW.lib(init.obj) : error LNK2019: unresolved external symbol _glfwSelectPlatform referenced in function glfwInit
3>GLFW.lib(vulkan.obj) : error LNK2019: unresolved external symbol _glfwPlatformLoadModule referenced in function _glfwInitVulkan
3>GLFW.lib(vulkan.obj) : error LNK2019: unresolved external symbol _glfwPlatformFreeModule referenced in function _glfwInitVulkan
3>GLFW.lib(vulkan.obj) : error LNK2019: unresolved external symbol _glfwPlatformGetModuleSymbol referenced in function _glfwInitVulkan
一开始很难,类似的问题在谷歌上稍有见效 ,而且多是英文。
从这篇文章开始(参考文章之一)我开始考虑是否因为Win32或glfw3.lib缺失这样的属性问题,但是超出我的理解范畴。但这让我确定问题出现在项目配置中,无论是项目目录或者premake5.lua中出现的问题。
##最终解决方法
然后我发现了这篇文章,真的谢谢这位小哥 :)
(c++ - trouble linking with glfw using premake and vs2019 - Stack Overflow)
可能大家进不去,我截个屏,稍有遗失但问题不大
问题呢,大概也就是premake文件配置的过程中缺失了一些必要的文件,有点刁钻,这个小哥还是使用了一些额外的语句编辑了premake文件,我则直接在Cherno的文件上做了修改
project "GLFW"
kind "StaticLib"
language "C"
targetdir ("bin/" .. outputdir .. "/%{prj.name}")
objdir ("bin-int/" .. outputdir .. "/%{prj.name}")
files
{
"include/GLFW/glfw3.h",
"include/GLFW/glfw3native.h",
"src/glfw_config.h", --??should it to be delete?
"src/internal.h", --
"src/platform.h", --
"src/mappings.h", --
"src/context.c",
"src/init.c",
"src/input.c",
"src/monitor.c",
"src/platform.c", --
"src/vulkan.c",
"src/window.c",
"src/egl_context.c", --
"src/osmesa_context.c", --
"src/null_platform.h", --
"src/null_joystick.h", --
"src/null_init.c", --
"src/null_monitor.c", --
"src/null_window.c", --
"src/null_joystick.c", --
}
filter "system:windows"
buildoptions { "-std=c11", "-lgdi32" }
systemversion "latest"
staticruntime "On"
files
{
"src/win32_init.c",
"src/win32_module.c", --
"src/win32_joystick.c",
"src/win32_monitor.c",
"src/win32_time.h", --
"src/win32_time.c",
"src/win32_thread.h", --解决Vulkan.obj相关问题
"src/win32_thread.c",
"src/win32_window.c",
"src/wgl_context.c",
"src/egl_context.c",
"src/osmesa_context.c"
}
defines
{
"_GLFW_WIN32",
"_CRT_SECURE_NO_WARNINGS"
}
filter { "system:windows", "configurations:Release" }
buildoptions "/MT"
我在添加的文件之后加上了"--"注释符作为标记,可以看到,这样一来能够解决报错。
关于“ "src/glfw_config.h", --??should it to be delete?”
我不知道应不应该删除,但我留下了这个文件,并且成功运行了。
结语:
希望能帮到大家啊,如果有在学的可以多钻研钻研,我也同步了一个Github仓库(GitHub - JJJJJJJustin/Nut: The game_engine which learned from Cherno) ,里面也有自己做的笔记。
如果是刚进入Github大家庭的兄弟,点击commit可以查看每一次提交的代码,这样方便对比代码。
最后,真的希望能帮助到你!