C++:在Ubuntu上使用glfw3时出现未定义的引用错误

3

我正在尝试从这个教程中编译一个程序。

#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>

static void error_callback(int error, const char* description)
{
 fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
 if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
 glfwSetWindowShouldClose(window, GL_TRUE);
}
int main(void)
{
 GLFWwindow* window;
 glfwSetErrorCallback(error_callback);
 if (!glfwInit())
 exit(EXIT_FAILURE);
 window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); 
 if (!window)
 {
  glfwTerminate();
  exit(EXIT_FAILURE);
 }
 glfwMakeContextCurrent(window);
 glfwSetKeyCallback(window, key_callback);
 while (!glfwWindowShouldClose(window))
 {
  float ratio;
  int width, height;
  glfwGetFramebufferSize(window, &width, &height);
  ratio = width / (float) height;
  glViewport(0, 0, width, height);
  glClear(GL_COLOR_BUFFER_BIT);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);
  glBegin(GL_TRIANGLES);
  glColor3f(1.f, 0.f, 0.f);
  glVertex3f(-0.6f, -0.4f, 0.f);
  glColor3f(0.f, 1.f, 0.f);
  glVertex3f(0.6f, -0.4f, 0.f);
  glColor3f(0.f, 0.f, 1.f);
  glVertex3f(0.f, 0.6f, 0.f);
  glEnd();
  glfwSwapBuffers(window);
  glfwPollEvents();
 }
 glfwDestroyWindow(window);
 glfwTerminate();
 exit(EXIT_SUCCESS);
 }

我尝试编译时得到的结果:

/usr/local/lib/libglfw3.a(x11_window.c.o): In function `_glfwPlatformCreateCursor':
x11_window.c:(.text+0x2d91): undefined reference to `XcursorImageCreate' 
x11_window.c:(.text+0x2e61): undefined reference to `XcursorImageLoadCursor'
x11_window.c:(.text+0x2e75): undefined reference to `XcursorImageDestroy'

我使用这个命令。
g++ glfw.o -lglfw3 -lGL -lGLU -lX11 -lXxf86vm -lXrandr -lpthread -lXi -lm -lalleg

运行在Ubuntu 13.10上

我到处搜索,安装了box2d、glfw、glfw3、allegro等库——原因是我阅读了任何提到glfw和未定义引用的讨论,并在五个小时的僵局中感到沮丧,安装了任何被提到的库。结果仍然相同。我不知道接下来该怎么做。请问有什么想法是什么导致这种情况的吗? 谢谢。


注意:如果没有使用-c参数,g++会编译并链接成可执行文件。如果您想要一个实际的.o文件,请使用-c参数。但这不是导致链接错误的原因。 - Colonel Thirty Two
你是否链接了 opengl32 库? - David G
@0x499602D2:希望不是这样,因为这是在Linux上使用X11/GLX。opengl32是用于Windows上的Win32/WGL。 - Andon M. Coleman
@AndonM.Coleman:错了,左边的库应该依赖于右边的库。 - Dietrich Epp
5
@Kuro,还需添加-lXcursor以解决你的依赖问题。 - Andon M. Coleman
@Andon M.Coleman:-lXcursor是缺失的库。非常感谢你。你可以把它写成一个答案,这样我就能接受了吗? - Kuro
2个回答

11

在Andon M. Coleman 先生回答了这个问题之前(他在评论中回答了这个问题),问题在于缺少了-lXcursor


2

手动编写这些命令很繁琐,你可以使用 pkg-config 来简化操作。可以尝试使用以下类似于Makefile语法的命令:

LIBS := $(shell pkg-config --libs glfw3) -lm -lalleg
g++ $(LDFLAGS) glfw.o -pthread $(LIBS)

还要注意使用-lpthread而非-pthread

关于库的顺序说明

在Linux上使用GNU Binutils时,指定库的顺序很重要。这在OS X或Windows上并不适用。符号是通过按顺序扫描库来解析的,因此任何未解决的库中的未解析符号必须由命令行参数后跟的库解决。

请注意,如果您使用静态GLFW,您可能需要使用pkg-config --libs --static glfw3

术语说明

这个命令:

g++ file.o <flags>

不编译代码。代码已经编译完成,该命令链接编译好的文件。


其实并不那么糟糕。我切换到终端(我将其保留在底部桌面[4个桌面]),按“上箭头”,就能得到最后一个命令:D除此之外,我已经为之前使用GLUT的代码编写了一个Makefile。我正在尝试切换到GLFW3,因为OpenGL网站上说不要使用GLUT,而GLFW最适合游戏(花了我一段时间才注意到)。稍后我会设置好Makefile,但现在很重要的是启动该死的图形模式,画点东西,并且在这个过程中不要发疯。 - Kuro
谢谢你的术语注释。当我写问题时,我有点知道我在使用错误的术语,但不知道正确的术语。 - Kuro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接