编译openGL+;GLSL提供未定义的引用

编译openGL+;GLSL提供未定义的引用,opengl,linker,makefile,undefined-reference,Opengl,Linker,Makefile,Undefined Reference,我试图从互联网上编译这段代码,但我失败得很惨。 看起来opengl库不见了——但它们在那里——我查过了。同样的情况也适用于过剩和低收入 系统是Ubuntu 12.04, glxinfo确认视频适配器为openGL 2.1 以下是生成文件: all: ljus ljus: ljus.c glsl_shader.c calculation.c calculation.h pyramid_func.c gcc -std=gnu99 -Wall -o ljus -I. -lz -lglut -lGL -

我试图从互联网上编译这段代码,但我失败得很惨。 看起来opengl库不见了——但它们在那里——我查过了。同样的情况也适用于过剩和低收入

系统是Ubuntu 12.04, glxinfo确认视频适配器为openGL 2.1

以下是生成文件:

all: ljus
ljus: ljus.c glsl_shader.c calculation.c calculation.h pyramid_func.c
gcc -std=gnu99 -Wall -o ljus -I. -lz -lglut -lGL -lGLU ljus.c 
我试图将不同的路径传递给linker,但没有成功。我做错了什么

注意:这里是“制造”输出(很长-对不起):


报告丢失的函数不是基本OpenGL ABI的一部分,这意味着必须在运行时通过扩展加载机制加载它们

最简单的解决方案:获取GLEW(在大多数Linux发行版的包管理器中)。在基于Debian的Ubuntu上运行
sudo apt get install libglew dev

#include
替换为
#include
并调用
glewInit()

然后链接到
-lGL-lGLEW…
,并将库列表放在编译单元源文件!之后!。一般来说,在两个不同的步骤中编译和链接是有意义的

gcc -std=gnu99 -Wall -o ljus -I. -lz -lglut -lGL -lGLU ljus.c 
参数顺序很重要

试试这个:

gcc -std=gnu99 -Wall ljus.c -o ljus -I. -lz -lglut -lGL -lGLU 

,oldskool.“参数顺序很重要。”-如果liba需要libb,那么-lA在-lB之前(是的,有点违反直觉)。IIRC适用于库(-lglut before-lGL)和转换单元(ljus.c before-lGL等),这很有用,但请注意,类似
glVertex2f
的函数也在列表中。@Kos:参数顺序很重要。ljus.c应该在库之前出现。一开始没看到这个。
gcc -std=gnu99 -Wall ljus.c -o ljus -I. -lz -lglut -lGL -lGLU