Mein GCC kompiliert ungefragt Debug-Symbole ein!
-
Servus,
ich hab hier folgendes Problem: Über die SuSe-Paketverwaltung hab ich mal bei mir alles auf den neuesten Stand gebracht.
Ich hab aktualisiert von gcc 4.2 und qt 4.3.1
auf gcc 4.3.1 und qt 4.4.3Seitdem werden meine Binaries 10 mal so groß wie vorher. Habe nun im Ausschlussverfahren Qt oder irgendwelche statisch gelinkten Bibliotheken ausgeschlossen. Es liegt am gcc. Bei identischen Makefiles erzeugt er auf meinem einen Rechner mit der alten Version kleine binaries ohne debug-symbole, auf meinem aktualisierten System sind die binaries 10-mal so groß, wenn ich dann aber
strip --strip-debug meinelib.a
mache, ist das binary wieder genauso klein. Jetzt wüsste ich gerne, warum bei identischen Makefiles einmal mit und einmal ohne debug kompiliert wird.
Das Makefile (gekürzt):
############################################################################# # Makefile for building: libvaslib.a # Generated by qmake (2.01a) (Qt 4.4.3) on: Mi Nov 12 19:20:08 2008 # Project: vaslib.pro # Template: lib # Command: /usr/bin/qmake -unix -o Makefile vaslib.pro ############################################################################# ####### Compiler, tools and options CC = gcc CXX = g++ DEFINES = -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED CFLAGS = -pipe -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -O2 -g -Wall -W -fPIC -D_REENTRANT $(DEFINES) CXXFLAGS = -pipe -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -O2 -g -Wall -W -fPIC -D_REENTRANT $(DEFINES) INCPATH = -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtNetwork -I/usr/include/QtNetwork -I/usr/include/QtGui -I/usr/include/QtGui -I/usr/include/QtXml -I/usr/include/QtXml -I/usr/include -I. -I. AR = ar cqs RANLIB = QMAKE = /usr/bin/qmake TAR = tar -cf COMPRESS = gzip -9f COPY = cp -f SED = sed COPY_FILE = $(COPY) COPY_DIR = $(COPY) -r INSTALL_FILE = install -m 644 -p INSTALL_DIR = $(COPY_DIR) INSTALL_PROGRAM = install -m 755 -p DEL_FILE = rm -f SYMLINK = ln -sf DEL_DIR = rmdir MOVE = mv -f CHK_DIR_EXISTS= test -d MKDIR = mkdir -p ####### Output directory OBJECTS_DIR = ./ ####### Files SOURCES = assert.cpp \ config.cpp \ configwidget.cpp \ ....blablabla OBJECTS = assert.o \ config.o \ configwidget.o \ ... blablabla .... DIST = /usr/share/qt4/mkspecs/common/g++.conf \ /usr/share/qt4/mkspecs/common/unix.conf \ /usr/share/qt4/mkspecs/common/linux.conf \ /usr/share/qt4/mkspecs/qconfig.pri \ /usr/share/qt4/mkspecs/features/qt_functions.prf \ /usr/share/qt4/mkspecs/features/qt_config.prf \ /usr/share/qt4/mkspecs/features/exclusive_builds.prf \ /usr/share/qt4/mkspecs/features/default_pre.prf \ /usr/share/qt4/mkspecs/features/release.prf \ /usr/share/qt4/mkspecs/features/default_post.prf \ /usr/share/qt4/mkspecs/features/warn_on.prf \ /usr/share/qt4/mkspecs/features/staticlib.prf \ /usr/share/qt4/mkspecs/features/static.prf \ /usr/share/qt4/mkspecs/features/qt.prf \ /usr/share/qt4/mkspecs/features/unix/thread.prf \ /usr/share/qt4/mkspecs/features/moc.prf \ /usr/share/qt4/mkspecs/features/resources.prf \ /usr/share/qt4/mkspecs/features/uic.prf \ /usr/share/qt4/mkspecs/features/yacc.prf \ /usr/share/qt4/mkspecs/features/lex.prf \ vaslib.pro QMAKE_TARGET = vaslib DESTDIR = ../lib/ TARGET = libvaslib.a first: all ####### Implicit rules .SUFFIXES: .o .c .cpp .cc .cxx .C .cpp.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .cc.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .cxx.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .C.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .c.o: $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<" ####### Build rules all: Makefile ../lib/$(TARGET) staticlib: ../lib/$(TARGET) ../lib/$(TARGET): ui_waypointchoosedlg.h ui_routedlg.h ui_infodlg.h ui_chart.info.dlg.h ui_latlonpointdlg.h ui_pbdpointdlg.h ui_textelemdlg.h $(OBJECTS) $(OBJCOMP) @$(CHK_DIR_EXISTS) ../lib/ || $(MKDIR) ../lib/ -$(DEL_FILE) $(TARGET) $(AR) $(TARGET) $(OBJECTS) -$(DEL_FILE) ../lib/$(TARGET) -$(MOVE) $(TARGET) ../lib/ Makefile: vaslib.pro /usr/share/qt4/mkspecs/default/qmake.conf /usr/share/qt4/mkspecs/common/g++.conf \ /usr/share/qt4/mkspecs/common/unix.conf \ /usr/share/qt4/mkspecs/common/linux.conf \ /usr/share/qt4/mkspecs/qconfig.pri \ /usr/share/qt4/mkspecs/features/qt_functions.prf \ /usr/share/qt4/mkspecs/features/qt_config.prf \ /usr/share/qt4/mkspecs/features/exclusive_builds.prf \ /usr/share/qt4/mkspecs/features/default_pre.prf \ /usr/share/qt4/mkspecs/features/release.prf \ /usr/share/qt4/mkspecs/features/default_post.prf \ /usr/share/qt4/mkspecs/features/warn_on.prf \ /usr/share/qt4/mkspecs/features/staticlib.prf \ /usr/share/qt4/mkspecs/features/static.prf \ /usr/share/qt4/mkspecs/features/qt.prf \ /usr/share/qt4/mkspecs/features/unix/thread.prf \ /usr/share/qt4/mkspecs/features/moc.prf \ /usr/share/qt4/mkspecs/features/resources.prf \ /usr/share/qt4/mkspecs/features/uic.prf \ /usr/share/qt4/mkspecs/features/yacc.prf \ /usr/share/qt4/mkspecs/features/lex.prf \ /usr/lib/libQtXml.prl \ /usr/lib/libQtCore.prl \ /usr/lib/libQtGui.prl \ /usr/lib/libQtNetwork.prl $(QMAKE) -unix -o Makefile vaslib.pro /usr/share/qt4/mkspecs/common/g++.conf: /usr/share/qt4/mkspecs/common/unix.conf: /usr/share/qt4/mkspecs/common/linux.conf: /usr/share/qt4/mkspecs/qconfig.pri: /usr/share/qt4/mkspecs/features/qt_functions.prf: /usr/share/qt4/mkspecs/features/qt_config.prf: /usr/share/qt4/mkspecs/features/exclusive_builds.prf: /usr/share/qt4/mkspecs/features/default_pre.prf: /usr/share/qt4/mkspecs/features/release.prf: /usr/share/qt4/mkspecs/features/default_post.prf: /usr/share/qt4/mkspecs/features/warn_on.prf: /usr/share/qt4/mkspecs/features/staticlib.prf: /usr/share/qt4/mkspecs/features/static.prf: /usr/share/qt4/mkspecs/features/qt.prf: /usr/share/qt4/mkspecs/features/unix/thread.prf: /usr/share/qt4/mkspecs/features/moc.prf: /usr/share/qt4/mkspecs/features/resources.prf: /usr/share/qt4/mkspecs/features/uic.prf: /usr/share/qt4/mkspecs/features/yacc.prf: /usr/share/qt4/mkspecs/features/lex.prf: /usr/lib/libQtXml.prl: /usr/lib/libQtCore.prl: /usr/lib/libQtGui.prl: /usr/lib/libQtNetwork.prl: qmake: FORCE @$(QMAKE) -unix -o Makefile vaslib.pro dist: @$(CHK_DIR_EXISTS) .tmp/vaslib1.0.0 || $(MKDIR) .tmp/vaslib1.0.0 $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/vaslib1.0.0/ && $(COPY_FILE) --parents ptrlist.h assert.h config.h ...blablabla ... .tmp/vaslib1.0.0/ && $(COPY_FILE) --parents assert.cpp config.cpp ...blablabla ... .tmp/vaslib1.0.0/ && $(COPY_FILE) --parents waypointchoosedlg.ui routedlg.ui infodlg.ui chart.info.dlg.ui latlonpointdlg.ui pbdpointdlg.ui textelemdlg.ui .tmp/vaslib1.0.0/ && (cd `dirname .tmp/vaslib1.0.0` && $(TAR) vaslib1.0.0.tar vaslib1.0.0 && $(COMPRESS) vaslib1.0.0.tar) && $(MOVE) `dirname .tmp/vaslib1.0.0`/vaslib1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/vaslib1.0.0 clean:compiler_clean -$(DEL_FILE) $(OBJECTS) -$(DEL_FILE) *~ core *.core ####### Sub-libraries distclean: clean -$(DEL_FILE) $(TARGET) -$(DEL_FILE) Makefile mocclean: compiler_moc_header_clean compiler_moc_source_clean mocables: compiler_moc_header_make_all compiler_moc_source_make_all compiler_moc_header_make_all: moc_config.cpp .... compiler_moc_header_clean: -$(DEL_FILE) moc_config.cpp ... moc_config.cpp: assert.h \ config.h /usr/bin/moc $(DEFINES) $(INCPATH) config.h -o moc_config.cpp ... und weitere Abhängigkeiten der moc-files.... compiler_rcc_make_all: compiler_rcc_clean: ...blabla, alle möglichen Resourcen die noch durch den Resourcencompiler gejagt werden müssen... compiler_clean: compiler_moc_header_clean compiler_uic_clean ####### Compile assert.o: assert.cpp assert.h \ logger.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o assert.o assert.cpp ... und sämtliche Abhängikeiten aller .o-Files .... moc_config.o: moc_config.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_config.o moc_config.cpp ####### Install install: FORCE uninstall: FORCE FORCE:
Sodele, und mein gcc gibt folgendes aus:
gcc -v Using built-in specs. Target: i586-suse-linux Configured with: ../configure --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.3 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --with-slibdir=/lib --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --program-suffix=-4.3 --enable-version-specific-runtime-libs --enable-linux-futex --without-system-libunwind --with-cpu=generic --build=i586-suse-linux Thread model: posix gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux)
Alle sachdienlichen Hinweise erwünscht!
Gruß,
-
Wenn ich das richtig sehe, wird in der Makefile für CXXFLAGS und CFLAGS der GCC-Parameter -g gesetzt, der nichts anderes macht, als die Generierung von Debug-Symbolen anzuschalten. Womöglich steht dies in einem direkten kausalen Zusammenhang mit Deinem Problem...
-
Und wenn Du die Makefile von qmake erzeugen läßt, ist es auch wichtig, was in der .pro-Datei steht. Wenn dort sowas wie "CONFIG += debug" drinne steht, dann erzeugt qmake eine Makefile mit gesetztem -g Parameter für die CXXFLAGS und CFLAGS.
-
Und wenn Du die Makefile von qmake erzeugen läßt, ist es auch wichtig, was in der .pro-Datei steht. Wenn dort sowas wie "CONFIG += debug" drinne steht, dann erzeugt qmake eine Makefile mit gesetztem -g Parameter für die CXXFLAGS und CFLAGS.
-
Dr. Tux schrieb:
Und wenn Du die Makefile von qmake erzeugen läßt, ist es auch wichtig, was in der .pro-Datei steht. Wenn dort sowas wie "CONFIG += debug" drinne steht, dann erzeugt qmake eine Makefile mit gesetztem -g Parameter für die CXXFLAGS und CFLAGS.
So siehts aus, ich schreibe kilometerlange Makefiles ungerne von Hand, sondern lasse es mir von qmake erzeugen. Nun sind im dazu notwendige .pro-File bereits die release-Option an und die debug-option ausgeschaltet. Unter Windows und auf Mac kommt dann auch genau das raus was soll, nämlich eine optimierte release-Version, aber hier auf der Linux-Kiste leider nicht.
Das .pro:
TEMPLATE = lib QT += network xml CONFIG += qt staticlib warn_on windows release CONFIG -= rtti exceptions stl thread debug TARGET = vaslib DESTDIR = ../lib TARGET.path = . INSTALLS += TARGET DEPENDPATH += . LIBS += -L"../lib" #QMAKE_CC = ccache gcc #QMAKE_CXX = ccache g++ #QMAKE_CXXFLAGS += -Wextra #QMAKE_CXXFLAGS_DEBUG += -Wextra # # "profile" configuration that enables profiling with gprof # profile { QMAKE_CXXFLAGS += -pg -g -O3 -DNDEBUG QMAKE_LFLAGS += -pg -g } #################### RC_FILE = vaslib.rc ... jetzt resourcen, headers, sources, forms...
Gruß,
Phil
-
Du könntest unter /usr/share/qt4/mkspecs in den Ordner linux-g++, linux-g++-32 oder linux-g++-64 und common nachschauen, ob in den dort liegenden *.conf-Dateien ungewöhnliche Einträge stehen. Ich hatte es mal bei einer QT-Version, da konnte man keine Debug-Symbole einkompilieren. (Also das genaue Gegenteil Deines Problems.) Da mußte dann eine Datei unter /usr/share/qt4/mkspecs/common angepaßt werden und dann ging das. Möglich, daß das auch hier ein Problem ist.
-
Also unter /usr/share/qt4/mkspecs/common
steht in der g++.confQMAKE_CFLAGS_RELEASE += -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -O2 -g QMAKE_CFLAGS_DEBUG += -g
Das wird das Problem sein, oder? Es steht beidesmal -g.
Danke für den Tipp!
-
Super, jetzt werden meine binaries wieder schön kuschelig klein!
Danke!