解决方案:
要解决此问题,使用以下命令:
g++ -o one one.cpp -Wall -std=c++11 -O3 -static -lrt -pthread \ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
理解问题:
由于使用了弱符号,静态链接到 pthread 需要特定的方法。
ELF文件(在Unix中使用)区分强符号和弱符号:
GLIBC 和 pthread使用弱符号来实现线程安全功能。弱符号版本在静态库中定义,而强符号版本在动态库中定义。动态链接时,使用强符号,但静态链接时,必须将弱符号替换为强版本。
静态链接时,链接器查看存档中的第一个符号并停止搜索。 -Wl,--whole-archive 标志强制链接器查看存档中的所有符号,包括弱符号。 -Wl,--no-whole-archive 标志关闭后续存档的此选项。
通过使用这些标志,您可以确保 pthread 函数的强符号版本包含在可执行文件中,从而解决弱符号导致的分段错误问题。
以上是为什么将 pthread 与 g 静态链接会导致分段错误,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!