2016-02-06 2 views
0

Я хочу написать make-файл для статической библиотеки. И мне нужна версия этой библиотеки с отладочной информацией, чтобы сделать некоторые отладки ..Linux debug library

Это то, что у меня есть:

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 [email protected] 

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 

Чтобы пояснить, что мне нужно: Я хочу, чтобы иметь возможность для отладки код файлов, перечисленных в SRCCORE в KDevelop (с использованием GDB) при запуске PolycodeTemplate.

Я в конце своих знаний о make-файлах: $
Спасибо за помощь!

+0

Ваш make-файл должен быть хорошим. Но я изменю 'CC' на' CXX' и 'CFLAGS' на' CXXFLAGS' – dlmeetei

ответ

2

Вам необходимо создать отдельную версию каждой единицы перевода с включенными флагами отладки, а именно -g.

Обычно каждый блок перевода .cpp скомпилирован в .o, и вы понимаете правило для этого. Выберите расширение для версии отладки, давайте использовать «.Не»:

DEBUGFLAGS= -g 

.cpp.do: 
    @echo "Building "$< 
    @$(CC) $(CFLAGS) $(DEBUGFLAGS) -c $< -o [email protected] 

Теперь foo.cpp собирается компилируются в foo.do используя -g флаг. Таким образом, это сводится к:

a) Сборка вашей обычной библиотеки так, как вы сейчас делаете.

b) Сборка библиотеки отладки от .do файлов, а не .lo файлов.

Я вижу, что ваш Makefile уже определяет:

OBJCORE=$(SRCCORE:.cpp=.o) 

# ... 

    @ar rcs $(LIBDIR)/libPolycore.a $(OBJCORE) 

Итак, теперь давайте добавим это:

.SUFFIXES: .do 

DOBJCORE=$(SRCCORE:.cpp=.do) 

И ваше домашнее задание будет выяснить, что вам нужно сделайте это с помощью своей «отладочной» цели, чтобы использовать ее.

P.S. Если позже вы планируете включить оптимизацию, не добавляйте -O2, или некоторые из них, к CFLAGS. Определите отдельный макрос OPTFLAGS и добавьте его только в цель .cpp.o, так что отладочная версия библиотеки все еще не оптимизирована.

+0

Спасибо за ваш ответ. Похоже, он должен работать, если я изменю те вещи, которые вы сказали мне, чтобы они изменились .. но в нем говорится: 'make: *** Нет правила, чтобы сделать цель '../../src/core/lodepng.do' , необходимый для «отладки». Stop.' Смотрите мой новый make-файл [здесь] (http://pastebin.com/DF1QerUQ) – fodinabor

+0

@fodinabor - о, я думаю, вам нужно установить .SUFFIXES = .do также отредактировал мой ответ. –

+0

спасибо! который исправляет эту проблему, - но теперь есть еще одна проблема, которая заставляет меня думать, работает ли связывание: я получаю множество «неопределенных ссылок на» - эти ссылки теперь все должны быть найдены в libPolycored.a - g ++, похоже, находит это как это не говорит, что не нашел его ... так ли может быть, что архив создан неправильно? Или неправильно связаны? (ничего не изменил, кроме вещи SUFFIXES из моего последнего состояния) – fodinabor