【问题标题】:C++: glfw3 on ubuntu undefined referenceC++:ubuntu 上的 glfw3 未定义参考
【发布时间】:2014-06-06 22:57:06
【问题描述】:

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

#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 参数。不过,这不是您收到链接错误的原因。
  • 你链接到opengl32了吗?
  • @0x499602D2:希望不是,这是在 Linux 上使用 X11/GLX。 opengl32 适用于 Windows 上的 Win32/WGL。
  • @AndonM.Coleman:错了,左边的库应该依赖右边的库。
  • @Kuro,同时添加-lXcursor 来修复您的依赖关系。

标签: c++ opengl g++ glfw ubuntu-13.10


【解决方案1】:

直到先生。 AndonM.Coleman 发布了这个问题的答案(他在评论中做了),问题在于缺少-lXcursor

【讨论】:

    【解决方案2】:

    手动写出这些命令很痛苦。您想使用pkg-config。像这样的东西(Makefile 语法):

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

    还要注意使用-pthread 而不是-lpthread

    关于图书馆顺序的注意事项

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

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

    术语说明

    命令,

    g++ file.o <flags>
    

    不编译代码。代码已经编译好了,这个命令链接编译后的文件。

    【讨论】:

    • 这还不错,真的。我切换到终端(我保留在底部桌面 [4 个桌面] 上),按“向上”,然后获取最后一个命令:D 除此之外,我为之前使用 GLUT 的代码完成了一个生成文件。我正在尝试切换到 GLFW3,因为 openGl 网站说不要使用 GLUT,而 GLFW 最适合游戏(花了我一段时间才注意到)。我稍后会设置一个 makefile,但现在重要的是启动该死的图形模式,绘制一些东西,并且在这个过程中不要发疯。
    • 感谢您提供术语说明。)我有点知道我在写问题时使用了错误的术语,但不知道正确的术语。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多