Manjaro编译OpenGL SuperBible 6示例遇GLFW函数未定义引用错误
解决Manjaro下编译《OpenGL超级宝典》第6版示例代码的GLFW未定义引用问题
你遇到的问题本质是版本不兼容:你通过pacman安装的glfw-wayland是GLFW 3.x版本,而《OpenGL超级宝典》第6版的示例代码是针对GLFW 2.x编写的。报错里的glfwOpenWindowHint、glfwOpenWindow等函数都是GLFW 2.x的专属API,在GLFW 3.x中已经被完全废弃并移除,所以链接器找不到这些符号。
下面提供两个可行的解决方案,你可以根据需求选择:
方案一:适配GLFW 3.x API(推荐)
GLFW 2.x早已停止维护,适配新版API是更稳妥的长期方案。你需要修改示例代码中sb6/application.cpp里的run方法,将旧API替换为GLFW 3.x的对应接口:
glfwOpenWindowHint→glfwWindowHintglfwOpenWindow→glfwCreateWindow(同时需要调整窗口创建的参数逻辑)glfwGetDesktopMode→ 结合glfwGetPrimaryMonitor和glfwGetVideoMode实现glfwSetMousePosCallback→glfwSetCursorPosCallbackglfwSetMouseWheelCallback→glfwSetScrollCallbackglfwEnable/glfwDisable→glfwSetInputModeglfwGetWindowParam→glfwGetWindowAttrib
举个具体的替换示例:
原GLFW 2.x代码:
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, info.major); glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, info.minor);
替换为GLFW 3.x代码:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, info.major); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, info.minor);
修改完成后,确保CMakeLists.txt中正确链接GLFW 3.x库(你之前修改的配置应该已经覆盖这部分)。
方案二:编译使用GLFW 2.x版本
如果不想修改代码,可以编译示例代码对应的旧版GLFW:
- 下载GLFW 2.x的最后稳定版本(比如2.7.10)的源码
- 编译并安装:
mkdir build && cd build cmake .. -DBUILD_SHARED_LIBS=ON make && sudo make install - 修改sb6code的CMakeLists.txt,指定链接这个旧版GLFW库,例如:
find_library(GLFW_LIBRARY NAMES glfw PATHS /usr/local/lib) target_link_libraries(wrapmodes ${GLFW_LIBRARY}) # 替换为你的目标程序名
注意:GLFW 2.x对Wayland环境的支持非常有限,可能会出现显示异常,因此更推荐方案一。
内容的提问来源于stack exchange,提问作者SnakesCantWearBoots
相关产品推荐
相关产品推荐

