尝试构建简单的OpenGL程序时链接错误

use*_*994 5 opengl ubuntu linker netbeans

这是OpenGL代码:

#include <GL/glut.h>
void display()
{
 glClear(GL_COLOR_BUFFER_BIT);
}

int main(int argc,char **argv)
{
   glutInit(&argc,argv);
   glutCreateWindow("Hello,world!");
   glutDisplayFunc(display);
   glutMainLoop();
}
Run Code Online (Sandbox Code Playgroud)

错误消息是:

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/home/zh/workspace/OpenGL/CppApplication_1'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/cppapplication_1
make[2]: Entering directory `/home/zh/workspace/OpenGL/CppApplication_1'
mkdir -p dist/Debug/GNU-Linux-x86
g++ -lglut -lGLU -lGL -lGLEW    -o dist/Debug/GNU-Linux-x86/cppapplication_1 build/Debug/GNU-Linux-x86/main.o -L/usr/lib/x86_64-linux-gnu -Wl,-rpath,/usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/libglut.so /usr/lib/x86_64-linux-gnu/libGLU.so /usr/lib/x86_64-linux-gnu/libGLEW.so /usr/lib/x86_64-linux-gnu/libGLEWmx.so
/usr/bin/ld: build/Debug/GNU-Linux-x86/main.o: undefined reference to symbol 'glClear'
/usr/lib/x86_64-linux-gnu/libGL.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cppapplication_1] Error 1
make[2]: Leaving directory `/home/zh/workspace/OpenGL/CppApplication_1'
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/home/zh/workspace/OpenGL/CppApplication_1'
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 124ms)
Run Code Online (Sandbox Code Playgroud)

起初我以为这是因为安装的OpenGL版本太低了,但glClear可以从OpenGL 1.0获得并且存在于所有版本中(见这里).这是我系统上OpenGL的版本信息. 在此输入图像描述

我构建了freeglut 2.8.1和glew 1.10.0并将它们安装在我的系统中: 在此输入图像描述

我包含了库的路径并在环境中指定了所需的库: 在此输入图像描述 在此输入图像描述

另外,我已经在存储库中读取相关的主题:在这里输入链接的描述,在这里输入链接的描述,但他们不帮助.

我已经疲惫不堪,真的找不到我所缺少的东西来构建这么简单的OpenGL代码.你能告诉我如何解决这个问题吗?谢谢.

我使用的环境是:Ubuntu 14.04(64位)+ NetBeans 8.0

提示:当我评论glClear时,程序可以成功构建.

编辑:对于那些在Windows 7上工作并遇到类似链接问题(未找到OpenGL函数)的人来说,Vishwanath gowda在这个帖子中的答案可能有所帮助.

编辑2:我们知道Windows支持OpenGL很差,如果你同时使用英特尔的入门级集成显卡,英特尔的驱动程序不提供OpenGL的额外支持,你将不得不制作一个新的Mesa的OpenGL库.在这里指导.这可以做到,因为OpenGL独立于硬件,因此可以仅通过软件实现(一本书声称如此).如果您使用的是64位Win7,请小心使用machine = x86_64.您可以通过观察dumpbin/headers的输出来检查youropengldll.dll | more.您还可以使用"OpenGL Extension Viewer"软件检查Windows系统上OpenGL的功能是否得到增强.

Wyz*_*a-- 9

我可以使用以下命令在64位Ubuntu 14.04系统上编译您的示例程序:

g++ example.c -lGL -lGLU -lGLEW -lglut -o example
Run Code Online (Sandbox Code Playgroud)

链接选项的顺序很重要:必须依赖于它们的目标文件之后指定库.从GCC文档中可以-l选择:

它在您编写此选项的命令中有所不同; 链接器按照指定的顺序搜索和处理库和目标文件.因此,在文件之后但之前‘foo.o -lz bar.o’搜索库.如果引用函数,则可能无法加载这些函数.‘z’foo.obar.obar.o‘z’

(奇怪的是,即使我把-l选项放在第一位,程序也会在我的Debian系统上编译而没有错误.但是在Ubuntu上却没有.)