Linux下Premake构建GLFW项目报undefined reference链接错误
问题原因
报错属于典型的静态库符号缺失+链接配置错误,具体有两点:
- GLFW静态库的Linux编译配置漏加了
src/posix_module.c源文件,_glfwPlatformLoadModule/_glfwPlatformFreeModule/_glfwPlatformGetModuleSymbol三个函数的实现就在该文件中,未参与编译就会出现未定义引用。你在Windows配置里加了对应的src/win32_module.c,所以Windows下编译正常。 - 链接配置存在疏漏:一是Linux下依赖的X11相关系统库未添加,二是共享库UiEngine自身未链接dl、pthread等基础依赖,三是可执行程序UiApp的链接顺序不符合gcc/ld的符号解析规则,四是你自定义的
_X11宏无效,GLFW识别的平台宏是_GLFW_X11。
修复步骤
- 修改GLFW模块的Premake配置,找到
filter "system:linux"段的files列表,新增一行"src/posix_module.c",和其他posix前缀的源文件放在一起即可。 - 清理无效宏定义:删除UiEngine、UiApp两个项目Linux配置段里的
defines { "_X11" }内容,该宏对GLFW无效。 - 补全GLFW模块的Linux系统依赖链接,在GLFW的
filter "system:linux"段新增links配置:
links { "X11", "Xrandr", "Xinerama", "Xcursor", "Xxf86vm", "Xi", "dl", "pthread" }
- 修改UiEngine项目的Linux配置段,在links列表中补上
"dl"、"pthread",不要只在最终的UiApp里加这两个依赖——UiEngine作为共享库直接调用GLFW符号,自身就需要链接对应基础依赖。 - 调整UiApp项目Linux段的链接顺序,遵循“依赖方在前、被依赖方在后”的ld解析规则,links段改为如下顺序:
links { "UiEngine", "GLFW", "imgui", "X11", "Xrandr", "Xinerama", "Xcursor", "Xxf86vm", "Xi", "dl", "pthread" }
- 清理之前生成的bin、bin-int构建缓存目录,重新执行
premake5 gmake生成构建脚本,再运行make即可正常编译。
内容的提问来源于stack exchange,提问作者Cihat Akyol
相关产品推荐
相关产品推荐

