gpt4 book ai didi

static - 在 gfortran 中使用 -static 和 -fopenmp 时出现段错误

转载 作者:行者123 更新时间:2023-12-04 05:42:07 24 4
gpt4 key购买 nike

我在 fortran 中使用 openmp,在程序完全完成之前,它通过简单地尝试写入一行而遇到了段错误,如下所示:

783       module Lines
784
785 character*80 eline, dline
786
787 contains
788
789 subroutine InitializeLines
790 print*, 'writing to eline'
791 write(eline,'(1x,79(''#''))')
792 print*, 'writing to dline'
793 write(dline,'(1x,79(''-''))')
794 end subroutine InitializeLines
795
796 end module Lines

在主程序中,当我尝试调用 InitializeLines 时,它只是打印出 writing to eline在给我一个段错误之前。现在,当我在没有 -fopenmp 的情况下编译时,程序运行得非常好。 .另请注意,本节中只有一个线程处于事件状态(简单的 get_num_threads() 表明我输入的 InitializeLines 只有一个线程)。我一起飞 -fopenmp ,没有段错误,程序正确执行。

另请注意,我有一个 -DUSEOPENMP当我想使用 openmp 时,我的 makefile 中的标志。如果我没有定义它,那么就不会发生 openmp Action 。这很重要,因为当我编译时没有 -DUSEOPENMP ,但与 -fopenmp ,即使我 100% 确定我什至没有调用任何额外的线程或使用 openmp 的任何部分,我也遇到了相同的段错误问题。

现在,经过一些尝试,我发现当我取出 -static 时,这个问题就消失了。作为编译选项。我的问题是——为什么?为什么会这样 -static-fopenmp不一起工作,这是我可以用其他方式解决的问题吗?

最佳答案

这是一个 glibc specific problem – 静态链接不适用于线程程序,包括 OpenMP。不过有一个解决方法:强制链接器链接整个 libpthread.a存档,而不仅仅是直接引用的符号 -Wl,--whole-archive -lpthread -Wl,--no-whole-archive .

除非您有充分的理由静态链接系统库,否则不要这样做。

关于static - 在 gfortran 中使用 -static 和 -fopenmp 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11165338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com