Problem mit GCC / SWIG Optimierung
-
Hallo,
mein Problem ist leider recht diffus und ich hoffe es hier an der richtigen Stelle zu posten.
Also folgender Background: Ich habe ein Programm geschrieben, das ich ursprünglich nur unter Windows genutzt habe. Es ist eigentlich eine SharedLibrary und besitzt (per SWIG generiert) eine Python-Schnittstelle. Erstellt habe ich es ursprünglich mit VisualStudio.
Um dieses Programm auch unter LINUX nutzen zu können (ist alles ANSI C++) habe ich es zuerst unter Windows mit MinGW compiliert, was tadellos funktioniert. Es läuft auch ohne Fehler.
Der nächste Schritt war es unter LINUX zu compilieren was auch ohne größere Probleme gelang. Nach kurzer Zeit fiel mir aber auf, das mein Programm unter Linux nicht fehlerfrei läuft. Dies äußerte sich in fehlerhaften Ausgabedaten. Ich habe nach einiger Sucherrei den Fehler recht gut lokalisieren können und einige Funktionen ausgemacht die nicht fehlerfrei funktionieren.
u.a. diese simple Funktion:std::string trimstr(const std::string in) { char whitespace[] = {' ','\t'}; size_t firstNotWs; size_t lastNotWs; size_t length = in.length(); size_t lengthToKeep; firstNotWs = in.find_first_not_of(whitespace); lastNotWs = in.find_last_not_of(whitespace); if (firstNotWs==0 && lastNotWs==length-1) { return in; } else { if (firstNotWs < 0) return std::string("ERROR"); if (firstNotWs > length-1) return std::string("ERROR"); if (lastNotWs < firstNotWs) return std::string("ERROR"); if (lastNotWs > length) return std::string("ERROR"); lengthToKeep = lastNotWs-firstNotWs+1; return std::string(in,firstNotWs,lengthToKeep); } }
Bei der Fehlersuche habe ich festgestellt, dass die Fehler nur auftreten, wenn ich mit der Option -O2 compiliere. Andere Optimierungen scheinen unkritisch zu sein, aber O1,O2,O3 führen zu diesen Problemen.
Das sind die Restlichen Optionen im Makefile (habe ich von einem anderen Projekt genommen):
CFLAGS = -pipe -march=prescott -Wall -D_REENTRANT -msse3 CXXFLAGS = $(CFLAGS) INCPATH = -I. -I/usr/include/python2.5 LFLAGS = -shared -W1 -O1 LIBS = -L/usr/lib/python2.5/ -L/usr/lib -lpng -lSM -lICE -lXrender -lXrandr -lXfixes -lXcursor -lfreetype -lfontconfig -lXext -lX11 -lz -lm -lrt -ldl -lpthread $(TARGET): $(OBJECTS) @$(CHK_DIR_EXISTS) ../bin/ || $(MKDIR) ../bin/ $(LINK) $(LFLAGS) -o $(DESTDIR_TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) $(INCPATH)
Irgendwie komme ich damit nicht recht weiter. Habt ihr eine Idee, woran das liegen könnte?
Viele Grüße
-
char whitespace[] = {' ','\t'};
zu
const string& whitespace = " \t\n\r";
=> geht
Mit Swig hat es nichts zu tun, warum die Optimierung einen Einfluss hat, hab ich noch nicht überlegt.