Linux makefile 调试库
Posted
技术标签:
【中文标题】Linux makefile 调试库【英文标题】:Linux makefile debug library 【发布时间】:2016-02-06 23:05:03 【问题描述】:我想为静态库编写一个生成文件。我需要一个带有调试信息的库版本来进行一些调试..
这就是我所拥有的:
CC=g++
SRCDIR=../../src
SRCCORE = $(SRCDIR)/core/lodepng.cpp $(SRCDIR)/core/PolyBasicFileProvider.cpp $(SRCDIR)/core/PolyBezierCurve.cpp $(SRCDIR)/core/PolyBone.cpp $(SRCDIR)/core/PolyCamera.cpp $(SRCDIR)/core/PolyClient.cpp $(SRCDIR)/core/PolyColor.cpp $(SRCDIR)/core/PolyConfig.cpp $(SRCDIR)/core/PolyCore.cpp $(SRCDIR)/core/PolyCoreFileProvider.cpp $(SRCDIR)/core/PolyCoreInput.cpp $(SRCDIR)/core/PolyCoreServices.cpp $(SRCDIR)/core/PolyCubemap.cpp $(SRCDIR)/core/PolyData.cpp $(SRCDIR)/core/PolyEntity.cpp $(SRCDIR)/core/PolyEvent.cpp $(SRCDIR)/core/PolyEventDispatcher.cpp $(SRCDIR)/core/PolyEventHandler.cpp $(SRCDIR)/core/PolyFont.cpp $(SRCDIR)/core/PolyFontGlyphSheet.cpp $(SRCDIR)/core/PolyFontManager.cpp $(SRCDIR)/core/PolyGPUDrawBuffer.cpp $(SRCDIR)/core/PolyImage.cpp $(SRCDIR)/core/PolyInputEvent.cpp $(SRCDIR)/core/PolyLabel.cpp $(SRCDIR)/core/PolyLogger.cpp $(SRCDIR)/core/PolyMaterial.cpp $(SRCDIR)/core/PolyMaterialManager.cpp $(SRCDIR)/core/PolyMatrix4.cpp $(SRCDIR)/core/PolyMesh.cpp $(SRCDIR)/core/PolyObject.cpp $(SRCDIR)/core/PolyOpenGLGraphicsInterface.cpp $(SRCDIR)/core/PolyPAAudioInterface.cpp $(SRCDIR)/core/PolyParticleEmitter.cpp $(SRCDIR)/core/PolyPeer.cpp $(SRCDIR)/core/PolyPerlin.cpp $(SRCDIR)/core/PolyPhysFSFileProvider.cpp $(SRCDIR)/core/PolyQuaternion.cpp $(SRCDIR)/core/PolyQuaternionCurve.cpp $(SRCDIR)/core/PolyRay.cpp $(SRCDIR)/core/PolyRectangle.cpp $(SRCDIR)/core/PolyRenderDataArray.cpp $(SRCDIR)/core/PolyRenderer.cpp $(SRCDIR)/core/PolyResource.cpp $(SRCDIR)/core/PolyResourceManager.cpp $(SRCDIR)/core/PolyScene.cpp $(SRCDIR)/core/PolySceneEntityInstance.cpp $(SRCDIR)/core/PolySceneImage.cpp $(SRCDIR)/core/PolySceneLabel.cpp $(SRCDIR)/core/PolySceneLight.cpp $(SRCDIR)/core/PolySceneLine.cpp $(SRCDIR)/core/PolySceneManager.cpp $(SRCDIR)/core/PolySceneMesh.cpp $(SRCDIR)/core/PolyScenePrimitive.cpp $(SRCDIR)/core/PolySceneRenderTexture.cpp $(SRCDIR)/core/PolySceneSound.cpp $(SRCDIR)/core/PolySceneSprite.cpp $(SRCDIR)/core/PolyServer.cpp $(SRCDIR)/core/PolyShader.cpp $(SRCDIR)/core/PolySkeleton.cpp $(SRCDIR)/core/PolySocket.cpp $(SRCDIR)/core/PolySound.cpp $(SRCDIR)/core/PolySoundManager.cpp $(SRCDIR)/core/PolyString.cpp $(SRCDIR)/core/PolyTexture.cpp $(SRCDIR)/core/PolyThreaded.cpp $(SRCDIR)/core/PolyTimer.cpp $(SRCDIR)/core/PolyTimerManager.cpp $(SRCDIR)/core/PolyTween.cpp $(SRCDIR)/core/PolyTweenManager.cpp $(SRCDIR)/core/PolyVector2.cpp $(SRCDIR)/core/PolyVector3.cpp $(SRCDIR)/core/PolyVector4.cpp $(SRCDIR)/core/rgbe.cpp $(SRCDIR)/core/tinystr.cpp $(SRCDIR)/core/tinyxml.cpp $(SRCDIR)/core/tinyxmlerror.cpp $(SRCDIR)/core/tinyxmlparser.cpp $(SRCDIR)/core/PolySDLCore.cpp
OBJCORE=$(SRCCORE:.cpp=.o)
SRCTEMPLATE=$(SRCDIR)/view/linux/PolycodeView.cpp TemplateApp/PolycodeTemplateApp.cpp TemplateApp/PolycodeTemplate.cpp
OBJTEMPLATE=$(SRCTEMPLATE:.cpp=.o)
CFLAGS=-I../../include -g -DDEBUG
LIBDIR=../../lib/linux
LDFLAGS=-L$(LIBDIR) -lPolycore -lfreetype -lvorbisfile -lvorbis -logg -lphysfs -lz -lX11 -lrt -ldl -lpthread -lSDL -lGLEW -lGLU -lGL
LDFLAGS_DEBUG=-L$(LIBDIR) -lPolycored -lfreetype -lvorbisfile -lvorbis -logg -lphysfs -lz -lX11 -lrt -ldl -lpthread -lSDL -lGLEW -lGLU -lGL
default: setup core
setup:
@mkdir -p $(LIBDIR)
.cpp.o:
@echo "Building "$<
@$(CC) $(CFLAGS) -c $< -o $@
core: $(OBJCORE)
@echo "Linking $(LIBDIR)/libPolycore.a"
@ar rcs $(LIBDIR)/libPolycore.a $(OBJCORE)
debug: $(OBJCORE)
@echo "Linking $(LIBDIR)/libPolycored.a"
@ar rcs $(LIBDIR)/libPolycored.a $(OBJCORE)
template: $(OBJTEMPLATE)
@echo "Linking TemplateApp/PolycodeTemplate"
@$(CC) $(CFLAGS) $(LDFLAGS) $(OBJTEMPLATE) -o TemplateApp/PolycodeTemplate
templateDebug: $(OBJTEMPLATE)
@echo "Linking TemplateApp/PolycodeTemplate"
@$(CC) -DDEBUG -g $(CFLAGS) $(LDFLAGS_DEBUG) $(OBJTEMPLATE) -o TemplateApp/PolycodeTemplate
clean:
rm -f $(OBJCORE) $(LIBDIR)/libPolycore.a $(LIBDIR)/libPolycored.a
为了明确我需要什么: 我希望能够在运行 PolycodeTemplate 时在 KDevelop(使用 GDB)中调试 SRCCORE 中列出的文件的代码。
我对 makefile 的了解已经接近尾声了 :$ 感谢大家的帮助!
【问题讨论】:
你的 makefile 应该很好用。但我会将CC
更改为CXX
和CFLAGS
更改为CXXFLAGS
【参考方案1】:
您基本上需要为每个翻译单元构建一个单独的版本,并打开调试标志,即-g。
通常,每个.cpp
翻译单元都会被编译成.o
,并且您了解这样做的规则。为调试版本选择一个扩展,让我们使用“.do”:
DEBUGFLAGS= -g
.cpp.do:
@echo "Building "$<
@$(CC) $(CFLAGS) $(DEBUGFLAGS) -c $< -o $@
现在,foo.cpp
将使用-g
标志编译成foo.do
。所以,这归结为:
a) 以您现在的方式组装您的常规库。
b) 从 .do
文件而不是 .lo
文件组装您的调试库。
我看到你的 Makefile 已经定义了:
OBJCORE=$(SRCCORE:.cpp=.o)
# ...
@ar rcs $(LIBDIR)/libPolycore.a $(OBJCORE)
好的,现在,让我们添加这个:
.SUFFIXES: .do
DOBJCORE=$(SRCCORE:.cpp=.do)
而你的家庭作业将是弄清楚你需要对你的“调试”目标做什么,并利用它。
附:如果您以后打算打开优化,请不要将-O2
或类似的添加到CFLAGS
。定义一个单独的OPTFLAGS
宏,并将其添加到您的.cpp.o
目标中,这样库的调试版本仍然没有优化。
【讨论】:
感谢您到目前为止的回答。如果我改变你告诉我要改变的那些东西,听起来它应该可以工作。但它说:make: *** No rule to make target '../../src/core/lodepng.do', needed by 'debug'. Stop.
See my new makefile here
@fodinabor - 哦,我想你还需要设置 .SUFFIXES=.do,编辑我的答案。
谢谢!这解决了这个问题 - 但现在还有另一个问题让我思考链接是否有效:我得到了大量的undefined reference to
问题 - 现在这些引用都应该在 libPolycored.a 中找到 - g++ 似乎找到了它,因为它没有说它没有找到它......那么可能是档案没有正确创建吗?还是没有正确链接? (除了我上次状态的 SUFFIXES 之外没有改变任何东西)
@fodinabor 这是你必须自己弄清楚的事情。您可以使用“ar”命令来检查和验证创建的库的内容。以上是关于Linux makefile 调试库的主要内容,如果未能解决你的问题,请参考以下文章
如何调试Linux下vim编辑器写的代码?含实用快捷指令make和Makefile
如何调试Linux下vim编辑器写的代码?含实用快捷指令make和Makefile