glfw3 编译未定义的引用

2021-12-19 00:00:00 opengl gcc c++ glfw undefined-reference

我在编译使用 glfw3 库的程序时遇到问题.

I have a problem with compiling my program which uses glfw3 library.

尝试使用 make 进行编译时,我收到未定义引用的错误列表,但我的类已编译为 .o 文件,仅未创建最终的可执行文件.

I'm getting list of errors of undefined references when trying to compile with make but my classes are compiled into .o files, only final executable file is not created.

标准输出:

g++ -Wall -g -c main.cpp -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi 

g++ -Wall -g -c error.cpp -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi

g++ -Wall -g -c sWindow.cpp -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi 

g++ -Wall -g -o ecl main.o error.o sWindow.o -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi

标准错误:

/usr/local/lib/libglfw3.a(context.c.o): In function `parseGLVersion':
context.c:(.text+0x53): undefined reference to `glGetString'
/usr/local/lib/libglfw3.a(context.c.o): In function `_glfwRefreshContextAttribs':
context.c:(.text+0x907): undefined reference to `glGetIntegerv'
context.c:(.text+0x98a): undefined reference to `glGetIntegerv'
context.c:(.text+0x9df): undefined reference to `glGetIntegerv'
context.c:(.text+0xa32): undefined reference to `glGetIntegerv'
/usr/local/lib/libglfw3.a(context.c.o): In function `glfwExtensionSupported':
context.c:(.text+0xd59): undefined reference to `glGetString'
context.c:(.text+0xd93): undefined reference to `glGetIntegerv'
/usr/local/lib/libglfw3.a(window.c.o): In function `glfwCreateWindow':
window.c:(.text+0x6f8): undefined reference to `glClear'
/usr/local/lib/libglfw3.a(x11_time.c.o): In function `getRawTime':
x11_time.c:(.text+0x20): undefined reference to `clock_gettime'
/usr/local/lib/libglfw3.a(x11_time.c.o): In function `_glfwInitTimer':
x11_time.c:(.text+0x72): undefined reference to `clock_gettime'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `getFBConfigAttrib':
glx_context.c:(.text+0x51): undefined reference to `glXGetFBConfigAttrib'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `chooseFBConfig':
glx_context.c:(.text+0x7e): undefined reference to `glXGetClientString'
glx_context.c:(.text+0x104): undefined reference to `glXGetFBConfigs'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `createLegacyContext':
glx_context.c:(.text+0x43f): undefined reference to `glXCreateNewContext'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `_glfwInitContextAPI':
glx_context.c:(.text+0x48f): undefined reference to `glXQueryExtension'
glx_context.c:(.text+0x4ca): undefined reference to `glXQueryVersion'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `_glfwCreateContext':
glx_context.c:(.text+0x791): undefined reference to `glXGetVisualFromFBConfig'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `_glfwDestroyContext':
glx_context.c:(.text+0xd09): undefined reference to `glXDestroyContext'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `_glfwPlatformMakeContextCurrent':
glx_context.c:(.text+0xd55): undefined reference to `glXMakeCurrent'
glx_context.c:(.text+0xd70): undefined reference to `glXMakeCurrent'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `_glfwPlatformSwapBuffers':
glx_context.c:(.text+0xdc2): undefined reference to `glXSwapBuffers'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `_glfwPlatformExtensionSupported':
glx_context.c:(.text+0xe69): undefined reference to `glXQueryExtensionsString'
/usr/local/lib/libglfw3.a(glx_context.c.o): In function `_glfwPlatformGetProcAddress':
glx_context.c:(.text+0xeb1): undefined reference to `glXGetProcAddressARB'
collect2: ld returned 1 exit status
make: *** [ecl] Error 1

这是我的生成文件:

CXX = g++
CXXFLAGS = -Wall -g
LIBS = -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi
DEPENDENCIES = main.o error.o sWindow.o

# ****************************************************
# Targets needed to bring the executable up to date

ecl: $(DEPENDENCIES)
    $(CXX) $(CXXFLAGS) -o ecl $(DEPENDENCIES) $(LIBS)

main.o: main.cpp
    $(CXX) $(CXXFLAGS) -c main.cpp $(LIBS)

error.o: error.cpp
    $(CXX) $(CXXFLAGS) -c error.cpp $(LIBS)

sWindow.o: sWindow.cpp
    $(CXX) $(CXXFLAGS) -c sWindow.cpp $(LIBS) 

clean: 
    rm -f *.o main
    echo "Clean done"

您知道是什么原因造成的以及如何解决吗?

Do you have any idea what causes this and how to fix it?

推荐答案

按以下顺序进行:

-lglfw3 -lGLU -lGL

而不是这个:

-lGL -lGLU -lglfw3

GCC 对您在链接阶段指定库的顺序非常敏感.例如,如果 libA.a 依赖于 libB.a,那么您必须以下列方式调用链接器:

GCC is very sensitive to the order in which you specify libraries during the linking stage. For example, if libA.a depends on libB.a, then you'd have to invoke linker in the following way:

gcc ... -lA -lB ...

在您的情况下,libglfw3.a 显然取决于 libGL.a,因此您会遇到错误.

In your case, libglfw3.a obviously depends on libGL.a, hence the errors you are getting.

相关文章