将 "undefined reference to `glBegin' " 用于以前的工作项目,需要在 make 文件中更新什么?
Getting "undefined reference to `glBegin' " to formerly working project, what needs updating in make file?
所以我正在尝试重新构建一个运行了 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)
我认为 link 标志的顺序错误。
我觉得这不对……
LDFLAGS = -lGLEW -lGL -lGLU -lglut -lpthread -lSDL_mixer
发生的情况是 linker 按顺序搜索,所以如果你写 X Y Z,那么 X 可以使用来自 Y 和 Z 的符号,但是 Y 只能使用来自 Z 的符号,而 Z 不能使用任何其他库中的符号。一切都依赖的任何 "base" 库都应该放在最后。
有时,按错误的顺序排列仍然有效,这取决于库是静态库还是动态库、您使用的是哪个版本的库、库是如何编译的,等等。在我看来,这是一个严重的错误特征,顺序非常重要!其他一些工具链,例如 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 中有些常见。
所以我正在尝试重新构建一个运行了 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)
我认为 link 标志的顺序错误。
我觉得这不对……
LDFLAGS = -lGLEW -lGL -lGLU -lglut -lpthread -lSDL_mixer
发生的情况是 linker 按顺序搜索,所以如果你写 X Y Z,那么 X 可以使用来自 Y 和 Z 的符号,但是 Y 只能使用来自 Z 的符号,而 Z 不能使用任何其他库中的符号。一切都依赖的任何 "base" 库都应该放在最后。
有时,按错误的顺序排列仍然有效,这取决于库是静态库还是动态库、您使用的是哪个版本的库、库是如何编译的,等等。在我看来,这是一个严重的错误特征,顺序非常重要!其他一些工具链,例如 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 中有些常见。