因此,我正在尝试重新构建一个已有 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/