OpenGL程序无法链接?

时间:2018-06-13 18:07:21

标签: c++ opengl linker-errors glu

我正在尝试使用在Linux上发现的here的GA Sandbox源代码(特别是Ubuntu 16.04)。然而,当编译第一个例子时,我留下了这个错误。

g++  -g -O2   -o chap1ex1 chap1ex1.o  -lGL -lGLU -lglut ../../libgasandbox/libgasandbox.a
../../libgasandbox/libgasandbox.a(libgasandbox_a-gl_util.o): In function 
`pickLoadMatrix()':
/mnt/c/GASandbox/ga_sandbox-1.0.7/libgasandbox/gl_util.cpp:231: undefined 
reference to `gluPickMatrix'
collect2: error: ld returned 1 exit status
Makefile:216: recipe for target 'chap1ex1' failed

我应该提一下,提供上面提到的Makefile的configure脚本最初并不链接-lGL或-lGLU。这给了我一个关于丢失DSO的错误,这个错误通过链接-lGL得到纠正。然后我结束了这个错误。我在网上查找了任何类似的错误并找到this post,其中OP通过链接-lGLU解决了它。我不是那么幸运。

以下是有问题的代码片段,来自gl_util.cpp。

#include <string>

#include "gl_util.h"
#if defined (__APPLE__) || defined (OSX)
    #include <GLUT/glut.h>
#else
    #include <GL/glut.h>
#endif

// code inbetween

namespace GLpick {
bool g_pickActive = false;
int g_OpenGL_pick[4] = {0, 0, 0, 0}; 
double g_frustumNear = 1.0;
double g_frustumFar = 100.0;
double g_frustumWidth = -1.0;
double g_frustumHeight = -1.0;

int g_pickWinSize = 4;
}

void pickLoadMatrix() {
    if (!GLpick::g_pickActive) return;

    GLint viewport[4];
    glGetIntegerv(GL_VIEWPORT, viewport);
    gluPickMatrix(
        GLpick::g_OpenGL_pick[0], GLpick::g_OpenGL_pick[1], 
        GLpick::g_OpenGL_pick[2] * 2 + 1, GLpick::g_OpenGL_pick[3] * 2 + 1, 
        viewport);
}

在glu.h中,gluPickMatrix()的签名是GLAPI void GLAPIENTRY gluPickMatrix (GLdouble x, GLdouble y, GLdouble delX, GLdouble delY, GLint *viewport);。因此,我尝试将int g_OpenGL_pick[] = {0, 0, 0, 0};更改为GLdouble g_OpenGL_pick[] = {0.0, 0.0, 0.0, 0.0};。既不是也没有将个别值投射到GLdouble上。

我可以俯瞰什么?或者是否有任何概念可以帮助缩小我的搜索范围?

1 个答案:

答案 0 :(得分:1)

尝试在命令行上的所有libgasandbox.a选项之前移动-l。所以你的命令看起来像这样:

g++ -g -O2 -o chap1ex1 chap1ex1.o ../../libgasandbox/libgasandbox.a -lGL -lGLU -lglut

参数顺序对静态链接很重要,如this answer中所述:依赖于库的东西必须在该库之前。 libgasandbox显然取决于GLU,因此提前应该解决该错误。

如果GLU或过剩依赖于它,你可能还需要将-lGL移到最后(我不确定是否这样做)。