Compilation 从Fortran共享对象中分割错误

Compilation 从Fortran共享对象中分割错误,compilation,linker,fortran,shared-libraries,gfortran,Compilation,Linker,Fortran,Shared Libraries,Gfortran,我在文件gfunc.f90中有一个fortran子程序。我想从test.f90中的主程序调用此子程序 如果我将两个文件都保存在同一个目录中,并使用 gfortran gfunc.f90测试.f90-o测试 它很好用 但我希望子程序在库中。因此,我创建了一个名为gfunc/的子文件夹,并将gfunc.f90放在那里。在该文件夹中,我使用 gfortran-fdefault-real-8-fPIC-c gfunc.f90 及 gfortran-fdefault-real-8-shared-o gfu

我在文件gfunc.f90中有一个fortran子程序。我想从test.f90中的主程序调用此子程序

如果我将两个文件都保存在同一个目录中,并使用

gfortran gfunc.f90测试.f90-o测试

它很好用

但我希望子程序在库中。因此,我创建了一个名为gfunc/的子文件夹,并将gfunc.f90放在那里。在该文件夹中,我使用

gfortran-fdefault-real-8-fPIC-c gfunc.f90

gfortran-fdefault-real-8-shared-o gfunc.so gfunc.o

我现在用

gfortran test.f90 gfunc/gfunc.so

但现在,只要访问子例程中的变量,就会出现分段错误

如何正确编译和链接库

在这里,您可以找到一个最小的工作示例来重现问题:

gfunc.f90:

test.f90:

gfortran -fdefault-real-8 test.f90 gfunc/gfunc.so
您应该将fdefault-real-8添加到test.f90的编译中:

gfortran -fdefault-real-8 test.f90 gfunc/gfunc.so
从-fdefault-real-8中可以看出,双精度变量的宽度为16字节,因此在test.f90中没有双精度变量,双精度变量的宽度仅为8字节:

-fdefault-real-8

将默认实数类型设置为8字节宽的类型。如果这已经是默认设置,则不执行任何操作。此选项还影响非双精度实数常量(如1.0)的类型,并且如果可能,会将双精度的默认宽度提升到16字节,除非也给出了-fdefault-double-8


为什么你有-fdefault-real-8,而没有它,事情还能做吗?哦,亲爱的,谢谢你指出这一点!!我从未想过要检查浮点类型。我只是在没有争论的情况下试了一下,效果很好。我需要这个标志,因为我实际上想调用使用该标志编译的第三方库。你想回答这个问题还是我应该删除它,因为它与其他人的相关性很低?看到brady的评论,我认为这是一个相关的问题。更好的方法是编写代码,这样你就不需要使用编译器标志来更改类型的精度-这样做只会让你痛苦一生,正如你在这里学到的,既然fortran在这方面很在行,为什么不用标准方法呢?@brady,-default-real-8实际上做什么?如果您阅读gfortran源代码,答案可能会令人惊讶。正如Ian所说,最好避免这个选项,因为它可能会产生难以调试的后果。@evets它实际上做什么?好吧,我想让你看看我回答中的文档片段。如果实现与所述不同,那么我会说文档不完整或存在bug。我同意,这可能会令人困惑,而依赖这些标志是有风险的。但是,这并不意味着我的答案对问题中提供的源代码不完全有效。@brady,我很清楚gfortran文档中的说明。你没有回答我的问题,我故意写了它实际上做了什么?阅读gfortran源代码。该选项的作用比您想象的要大,并且可以以出乎意料的奇妙方式破坏应用程序。@evets我故意没有回答您的问题。我不打算深入研究源代码,因为你暗示其中可能有让我吃惊的东西。我的回答与原来的问题有关。如果你认为OP应该知道更多的信息,那么请尽一切可能写下你自己的答案。
gfortran -fdefault-real-8 test.f90 gfunc/gfunc.so