Ich habe in den letzten Tagen ein komisches Problem gekämpft. Wir erstellen einige Bibliotheken mit GCC 4.8, die einige ihrer Abhängigkeiten statisch verknüpfen - z. log4cplus oder boost. Für diese Bibliotheken haben wir Python-Bindings mit boost-python erstellt.Unterschied zwischen der Verbindung von OpenMP mit -fopenmp und -lgomp
Jedes Mal, wenn eine solche Bibliothek TLS verwendet (wie log4cplus bei der statischen Initialisierung oder stdlibC++ bei einer Ausnahme - nicht nur während der Initialisierungsphase), stürzte das Ganze in einem segfault ab - und jedes Mal die Adresse des Threads local Variable wurde 0.
Ich versuchte alles wie Neukompilieren, sicherzustellen, dass -fPIC verwendet wird, sicherzustellen, -tls-Modell = global-dynamische wird verwendet, etc. Kein Erfolg. Dann habe ich heute herausgefunden, dass der Grund für diese Abstürze unsere Art ist, OpenMP zu verlinken. Wir haben das mit "-lgomp" gemacht, anstatt nur "-fopenmp" zu verwenden. Seit ich das geändert habe, funktioniert alles gut - keine Abstürze, nichts. Fein!
Aber ich würde wirklich gerne wissen, was die Ursache des Problems war. Worin besteht der Unterschied zwischen diesen beiden Möglichkeiten, in OpenMP zu verlinken?
Wir haben eine CentOS 5 Maschine hier, wo wir eine GCC-4.8 in/opt/local/gcc48 installiert haben und wir sind auch sicher, dass die libgomp aus/opt/local/gcc48 verwendet wurde, genauso wie die libstdC++ von dort (DL_DEBUG benutzt).
Irgendwelche Ideen? Habe bei Google nichts gefunden - oder ich habe die falschen Schlüsselwörter verwendet :)
-pthread oder -lpthread war da – duselbaer
Kompilieren Sie mit '-v' und vergleichen Sie die Ausgabe ... –
Das Hinzufügen von -v als Linker-Option zeigt, dass -fopenmp implizit am Ende ein -lgomp hinzufügt. Alles andere bleibt gleich. Ohne -fopenp habe ich "-lstdC++ -lm -lgcc_s -lpthread -lc -lgcc_s" und mit -fopenmp wird es "-lstdC++ -lm -lgomp -lgcc_s -lpthread -lc -lgcc_s". Ich sehe immer noch nicht den Grund für die Abstürze, weil alle diese Bibliotheken dynamisch verknüpft sind :( – duselbaer