我正在尝试使用在Linux(特别是Ubuntu 16.04)上找到的here的GA Sandbox源代码。但是,在编译第一个示例时,我会遇到这个错误。
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的配置脚本最初并未链接-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。我可能会忽略什么?还是有什么概念可以帮助缩小搜索范围?
最佳答案
尝试将libgasandbox.a
移到命令行上的所有-l
选项之前。因此,您的命令将如下所示:
g++ -g -O2 -o chap1ex1 chap1ex1.o ../../libgasandbox/libgasandbox.a -lGL -lGLU -lglut
正如this answer中所述,参数的顺序对于静态链接确实很重要:依赖于库的事物必须先于该库。
libgasandbox
显然依赖于GLU,因此将其放早应该可以解决该错误。如果GLU或glut依赖于
-lGL
,则可能还需要将ojit_code移到最后(我不确定它们是否这样做)。