gpt4 book ai didi

c++ - Linux makefile 调试库

转载 作者:太空宇宙 更新时间:2023-11-04 09:27:06 25 4
gpt4 key购买 nike

我想为静态库编写一个 makefile。我需要一个带有调试信息的库版本来进行一些调试。

这是我的:

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 的了解已经结束了:$
感谢所有帮助!

最佳答案

您基本上需要为每个翻译单元构建一个单独的版本,并打开调试标志,即 -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 目标中,这样库的调试版本仍未优化。

关于c++ - Linux makefile 调试库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35247585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com