使用Meson Wrap安装GLFW3后,Windows下运行可执行文件找不到libglfw3-3.dll
问题分析与解决
原因
你遇到的问题本质是Windows动态链接库的加载路径问题:
- Meson通过Wrap安装的GLFW默认是动态链接版本,其DLL文件存放在Meson的构建缓存目录中,并没有自动复制到你的可执行文件输出目录。Windows加载DLL时会优先在当前可执行文件所在目录、系统目录等位置查找,找不到就会抛出缺失DLL的错误。
- 之前SDL2能正常运行,是因为SDL的Wrap配置或Meson内置逻辑自动完成了DLL的复制操作,而GLFW的Wrap没有这个默认设置。
解决方案
方案1:自动复制GLFW DLL到可执行目录
在你的meson.build中添加逻辑,获取GLFW的DLL路径,并在构建时将其复制到可执行文件所在目录:
project('project', 'cpp', version : '0.1', default_options : ['warning_level=3', 'cpp_std=c++14']) glfw_dep = dependency('glfw3') lua_dep = dependency('lua') # 获取GLFW动态库的路径 glfw_dll = glfw_dep.get_variable('dll') src_files = ['axolotl.cpp', 'Window.cpp'] exe = executable('project', src_files, win_subsystem: 'windows', dependencies: [glfw_dep, lua_dep], install : true) # 构建时自动复制GLFW DLL到可执行文件目录 custom_target('copy_glfw_dll', output : 'libglfw3-3.dll', command : ['cmd', '/c', 'copy', glfw_dll, '@OUTPUT@'], build_by_default : true, # 安装时也将DLL复制到安装目录的bin文件夹 install : true, install_dir : get_option('bindir'))
构建完成后,可执行文件所在目录会自动出现libglfw3-3.dll,运行时就能正常加载。如果Lua也是动态链接版本,你可以用同样的逻辑复制Lua的DLL。
方案2:静态链接GLFW
直接将GLFW静态链接到你的可执行文件中,这样就不需要携带DLL文件:
修改meson.build中获取GLFW依赖的代码,强制使用静态库版本:
glfw_dep = dependency('glfw3', default_options : ['default_library=static'])
静态链接会把GLFW的代码直接打包进你的可执行文件,虽然会增加文件体积,但不需要额外携带DLL,更适合单文件分发的场景。Meson会自动处理GLFW静态链接所需的依赖(比如OpenGL相关库)。
内容的提问来源于stack exchange,提问作者caffeine-code
相关产品推荐
相关产品推荐

