OpenBSD编译SFML程序遇未定义符号XRRGetScreenInfo绑定失败求助
SFML运行时未定义符号XRRGetScreenInfo问题解析
问题场景
编译SFML程序时执行以下命令:
clang++ test.cpp -L/usr/local/lib/ -lsfml-graphics -lsfml-window -lsfml-system ./a.out
运行时触发报错:
a.out:/usr/local/lib/libsfml-window.so.2.0: undefined symbol 'XRRGetScreenInfo' ld.so: a.out: lazy binding failed! Killed
关于链接器编译阶段未检查符号的原因
编译阶段的链接器只会检查你显式指定链接的库是否能满足当前代码的符号需求,不会递归解析动态库自身的依赖符号。另外,动态链接默认采用延迟绑定机制——程序启动时不会立刻解析所有符号,只有当某个函数第一次被调用时才会去查找对应的符号。
XRRGetScreenInfo是X11的Xrandr扩展库(libXrandr)提供的符号,而libsfml-window.so本身依赖这个库。如果SFML的包在构建时没有正确将libXrandr设为依赖并链接进去,或者你编译自己的程序时没有显式添加这个库,编译阶段链接器不会察觉到缺失,直到运行时动态加载库才会暴露问题。
是OpenBSD包损坏还是环境错误?
更可能是OpenBSD上的SFML包构建配置存在问题:正常情况下SFML的窗口模块必须依赖libXrandr,包应该自动处理这个依赖链接。当然也不排除你的环境中libXrandr未正确安装,但这种情况概率更低。
解决办法
- 临时修复:编译时显式添加
libXrandr链接:
clang++ test.cpp -L/usr/local/lib/ -lsfml-graphics -lsfml-window -lsfml-system -lXrandr
- 彻底修复:重新安装OpenBSD的SFML官方包;如果是自行编译的SFML,确保在配置时启用Xrandr支持,并确认构建过程中正确链接了
libXrandr。
内容的提问来源于stack exchange,提问作者WernerDrasche
相关产品推荐
相关产品推荐

