c++ - 获取 "undefined reference to ` glBegin'“到以前的工作项目,make 文件中需要更新什么?

标签 c++ linux opengl glut freeglut

因此,我正在尝试重新构建一个已有 4 年历史的项目,该项目一直有效,但现在遇到了问题。我能够解决一些与编译相关的问题,但现在我遇到了 openGL 调用的链接器问题。

就不同之处而言,现在不再是 freeglut,而是 freeglut3,不再是 libsdl-mixer,而是 libsdl-mixer1.2。

LDFLAGS 部分有什么需要更新的吗???

这里是 makefile 的片段:

CC=g++

# The _POSIX_* symbols only come into play on systems that are POSIX
# but not SUS.
# SUS3=-D_POSIX_SOURCE -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=600
HARDEN=-D_FORTIFY_SOURCE
TESTING=-D_FLAT_WORLD
CFLAGS= -pg -g `sdl-config --cflags --libs` -fpermissive
LDFLAGS=-lGLEW -lGL -lGLU -lglut -lpthread  -lSDL_mixer 

ALL=mech

mech:   $(ALL)

# -------------------------------------------------------
run.o:  ../run.cc ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

debug.o:    ../debug.cc ../debug.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

world.o:    ../world.cc ../world.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

gameRoot.o: ../gameRoot.cc ../gameRoot.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

gameState.o:    ../gameState.cc ../gameState.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

initGame.o: ../initGame.cc ../initGame.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

controls.o: ../controls.cc ../controls.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

levelManager.o: ../levelManager.cc ../levelManager.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

thread.o:   ../thread.cc ../thread.h
    $(CC) $(CFLAGS) -c $<

# ------------------------------------------------------- soundMngr
gmAudioPlayer.o:    ../soundMngr/gmAudioPlayer.cc ../soundMngr/gmAudioPlayer.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

gmAudioLoader.o:    ../soundMngr/gmAudioLoader.cc ../soundMngr/gmAudioLoader.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

# ------------------------------------------------------- MD5
md5anim.o: ../md5/md5anim.cc ../md5/MD5Model.h ../commonStrc.h ../md5/md5head.h
    $(CC) $(CFLAGS) -c $<

md5mesh.o:   ../md5/md5mesh.cc ../md5/MD5Model.h ../commonStrc.h ../md5/md5head.h
    $(CC) $(CFLAGS) -c $<

MD5Model.o: ../md5/MD5Model.cc ../md5/MD5Model.h ../commonStrc.h ../md5/md5head.h
    $(CC) $(CFLAGS) -c $<

# ------------------------------------------------------- myLib
myCorePoint.o:  ../myLib/myCorePoint.cc ../myLib/myCorePoint.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

myVec.o:    ../myLib/myVec.cc ../myLib/myVec.h
    $(CC) $(CFLAGS) -c $<

myVert.o:   ../myLib/myVert.cc ../myLib/myVert.h
    $(CC) $(CFLAGS) -c $<

myCam.o:   ../myLib/myCam.cc ../myLib/myCam.h
    $(CC) $(CFLAGS) -c $<

myTexMngr.o:   ../myLib/myTexMngr.cc ../myLib/myTexMngr.h
    $(CC) $(CFLAGS) -c $<

myVerBall.o:   ../myLib/myVerBall.cc ../myLib/myVerBall.h
    $(CC) $(CFLAGS) -c $<

MyCoor3.o:   ../myLib/MyCoor3.cc ../myLib/MyCoor3.h
    $(CC) $(CFLAGS) -c $<

MyMatr4.o:   ../myLib/MyMatr4.cc ../myLib/MyMatr4.h
    $(CC) $(CFLAGS) -c $<

.... some more stuff I cut out .....

bbFinder.o: ../org/bbFinder.cc ../org/bbFinder.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

pathFinder.o: ../org/pathFinder.cc ../org/pathFinder.h ../commonStrc.h
    $(CC) $(CFLAGS) -c $<

# --------------------------------------------------------

mech:   run.o debug.o world.o gameRoot.o gameState.o initGame.o controls.o levelManager.o thread.o gmAudioLoader.o gmAudioPlayer.o md5anim.o md5mesh.o MD5Model.o myVert.o myVec.o myCorePoint.o myCam.o myTexMngr.o myVerBall.o MyCoor3.o MyMatr4.o hud.o pauseScreen.o rotSeg.o mechLeg.o gameBound.o particle.o particleGroup.o BBHier.o BBox.o bSphere.o Missile.o drunk.o homing.o pHoming.o miniMis.o hydra.o buildingBlock.o Projectile.o explosion.o bBin.o bCone.o binIndices.o tiltBlock.o core.o blast.o pseudoModel.o pseudoReader.o pseudoParts.o pseudoMech.o turret.o actor.o hover.o pseudoPlayer.o mechAI.o misCan.o font.o flatFog.o env.o healZone.o amoZone.o itemGen.o materialPreset.o mainMenu.o controlMenu.o menuMngr.o lvlSelect.o shader.o mouseFix.o ctrlBox.o linThread.o winThread.o bbFinder.o pathFinder.o
    $(CC) -pg $(LDFLAGS) -o $@ $^

clean:
    rm -rf core* *.o *.gch $(ALL)

最佳答案

我认为链接标志的顺序错误。

这对我来说看起来不太合适......

LDFLAGS = -lGLEW -lGL -lGLU -lglut -lpthread -lSDL_mixer 

发生的情况是链接器按顺序搜索,因此如果您编写 X Y Z,则 X 可以使用 Y 和 Z 中的符号,但 Y 只能使用 Z 中的符号,而 Z 不能使用任何其他库中的符号。任何一切所依赖的“基础”库都应该放在最后。

有时,按照错误的顺序放置内容仍然会起作用,具体取决于库是静态库还是动态库、您使用的库版本、库的编译方式等等。在我看来,顺序很重要,这是一个严重的错误!其他一些工具链,例如 Darwin(macOS、iOS)工具链,通常不关心您指定库的顺序。

您的 LIBS 变量最终应如下所示:

LIBS = -lGLEW -lglut -lGLU -lGL -lSDL_mixer -pthread

但是你应该将它写在 makefile 中,如下所示:

LIBS := -lglut $(shell pkg-config --libs gl glu glew SDL_mixer) -pthread

构建规则应该如下所示:

LDFLAGS := -pg
mech: ...
    $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)

我做了一些更改。

  • 库位于 LIBS 中,而不是位于 LDFLAGS 中。

  • $(LIBS) 中的库位于命令行末尾,位于 $^ 之后。

  • 使用 := 避免多次扩展 $(shell ...)

  • 使用pkg-config 来正确配置大部分库。我不认为 glut 有 pkg-config 文件(它不在我的系统上),因此该文件是手动的。 pkg-config --libs 命令将为您按正确的顺序放置库,这样您就不必考虑太多。

  • 使用-pthread而不是-lpthreads(也应该在您的CFLAGS中)。

我计划发布一篇文章来解释所有这些,因为这些错误在 Makefile 中有些常见。

关于c++ - 获取 "undefined reference to ` glBegin'“到以前的工作项目,make 文件中需要更新什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38774200/

相关文章:

c++ - 强制调用 "highest"重载函数而不是基函数

c++ - 在 OpenGl 中旋转一个正方形

OpenGL 3.3 两个 GPU 上具有阴影贴图的 nVidia Optimus 上的两种不同结果

c++ - "int a;"是 C 和 C++ 中的声明还是定义?

c++ - 创建类链接错误

c++ - 对变量的标准结构数组进行排序

linux - 在终端中设置 python 文档的换行宽度

linux - Crosstool-ng python 错误

linux - 为什么我从 grep -oc "foo"file 和 grep -o "foo"file 得到不同的答案 | wc -l?哪个是对的?

macos - 适用于 Mac OS X 的免费 OpenGL 加速的类似 GNUPlot 的工具?