Die Lösung:
Um dieses Problem zu beheben, Verwenden Sie den folgenden Befehl:
g++ -o one one.cpp -Wall -std=c++11 -O3 -static -lrt -pthread \ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
Das Problem verstehen:
Die statische Verknüpfung mit pthread erfordert aufgrund der Verwendung schwacher Symbole einen bestimmten Ansatz.
ELF-Dateien (in Unix verwendet) unterscheiden zwischen starken und schwachen Symbolen:
GLIBC und pthread Verwenden Sie schwache Symbole für Thread-Sicherheitsfunktionen. Die schwachen Symbolversionen werden in den statischen Bibliotheken definiert, während die starken Symbolversionen in den dynamischen Bibliotheken definiert werden. Bei der dynamischen Verlinkung werden die starken Symbole verwendet, bei der statischen Verlinkung müssen die schwachen Symbole jedoch durch die starken Versionen ersetzt werden.
Beim statischen Linken schaut der Linker auf das erste Symbol in einem Archiv und stoppt die Suche. Das Flag -Wl,--whole-archive zwingt den Linker, alle Symbole im Archiv zu betrachten, einschließlich der schwachen Symbole. Das Flag -Wl,--no-whole-archive deaktiviert diese Option für nachfolgende Archive.
Durch die Verwendung dieser Flags stellen Sie sicher, dass die starken Symbolversionen der pthread-Funktionen in der ausführbaren Datei enthalten sind, wodurch das Problem behoben wird Segmentierungsfehlerproblem durch schwache Symbole.
Das obige ist der detaillierte Inhalt vonWarum verursacht die statische Verknüpfung von pthread mit g einen Segmentierungsfehler und wie kann ich ihn beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!