c++ - OpenGL程序无法链接?
问题描述
我正在尝试使用在 Linux(特别是 Ubuntu 16.04)上找到的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 得到纠正。然后我结束了这个错误。我在网上四处寻找任何类似的错误,发现了这篇文章,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
参数的顺序对于静态链接确实很重要,如本答案中所述:依赖于库的事物必须位于该库之前。libgasandbox
显然依赖于 GLU,所以把它放在前面应该可以解决这个错误。
如果 GLU 或 glut 依赖于它,您可能还需要移动-lGL
到最后(我不确定他们是否这样做)。
推荐阅读
- javascript - 如何根据用户在 WordPress 中使用 javascript 在 HTML 表单中选中的框重定向用户?
- python - 重命名熊猫中的一些列
- bigcommerce - BigCommerce Stencil 主题上的其他 Google 字体
- vb.net - VB 网络中 EditingControlShowing 中的 addhandler
- python - 如何通过单击 Flask 中的按钮显示数据库中的下一条记录?
- python - tkinter 按钮在窗口中不起作用或显示图像
- java - 如何将用户凭据传递给 WebLogic 11g 身份验证提供程序?
- php - 满足条件时自动删除数据库行(SQL)
- javascript - Spring MVC,ajax调用上的Thymleaf返回新的HTML页面
- emacs - Emacs org-mode 在标题属性后插入文本