得到"未明确引用`glBegin' "以前的工作项目,什么需要在make文件中更新?

时间:2016-08-04 17:50:25

标签: 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)

1 个答案:

答案 0 :(得分:3)

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

这对我来说不合适......

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使大多数图书馆正确无误。我不认为过剩有pkg-config文件(它不在我的系统上),因此一个是手动的。 pkg-config --libs命令会为您提供正确的库,因此您不必考虑它。

  • 使用-pthread代替-lpthreads(也应该在CFLAGS中)。

我打算发布一篇解释所有这些内容的文章,因为这些错误在Makefile中有点常见。