Makefile f77对getgid的未定义引用_

Makefile f77对getgid的未定义引用_,makefile,fortran,Makefile,Fortran,我被告知在stackoverflow上发布编译问题,所以这也是我必须问的问题!: 我正试图编译一个带有Makefile的程序。makefile使用f77,程序似乎调用了几个f95内部函数。当我尝试编译时,我得到: plotkit.a(userid.o): In function userid_': fort77-5163-1.c:(.text+0x13e): undefined reference togetgid_' fort77-5163-1.c:(.text+0x234): undefin

我被告知在stackoverflow上发布编译问题,所以这也是我必须问的问题!:

我正试图编译一个带有Makefile的程序。makefile使用f77,程序似乎调用了几个f95内部函数。当我尝试编译时,我得到:

plotkit.a(userid.o): In function userid_':
fort77-5163-1.c:(.text+0x13e): undefined reference togetgid_' fort77-5163-1.c:(.text+0x234): undefined reference to `getuid_' collect2: error: ld returned 1 exit status
在这个发行版中的另一个程序上,我也得到了与fdate相同的错误。我尝试将makefile更改为使用不同的编译器,如gfortran),它们都会导致更多错误

我的问题是如何让getgid、getuid和fdate与f77程序一起工作?我还感到困惑,因为有getgid和getuid手册页,但ubuntu上没有安装

我安装了64位14.04 LTS

谢谢你的建议。

默认情况下,gfortran(和其他Fortran编译器)通过添加下划线来破坏过程名称。在源代码中引用
getgid
时,编译器会将其更改为
getgid
。如果函数
getgid
未在Fortran源代码中定义,例如在C中,则这将导致链接错误,例如您遇到的链接错误

函数
getgid
getuid
等不是Fortran函数,它们是标准的C库函数。如果您使用的代码来自其他地方,请查看提供的makefile是否列出了禁用Fortran默认下划线的选项。对于gfortran,此选项为
-fno下划线
。将其附加到makefile中用于Fortran编译器的编译器标志。对于其他Fortran编译器,请参阅其文档以了解类似选项

如果您不局限于F77,并且可以利用现代Fortran功能,那么另一个选项是通过为C库函数提供可互操作的接口来解决这个问题。e、 g

interface
  function getgid() bind(C,name='getgid')
    use iso_c_binding
    implicit none
    integer(c_int32_t) :: getgid
  end function getgid
end interface
这将为C库函数
getgid
定义一个显式接口,以便您可以从现代Fortran实现中调用它。您可以为需要调用的每个C库函数定义这样的接口


*另一方面,虽然上述接口可以工作,并且从现代Fortran的角度来看是可移植的,但从C库的角度来看,它并不是100%可移植的。
getgid
的GNU实现返回类型
gid\u t
,尽管typedefs的长链最终与文件
/usr/include/bits/types.h
/usr/include/bits/typesizes.h
中的真实类型相关,作为无符号32位整数。Fortran没有无符号类型,因此虽然存储大小会匹配,但如果这些函数返回的值超过20亿左右,它们在Fortran中将被错误地理解为负值。此外,由于
gid_t
的存储类型是在“bits”C头树中定义的,因此它们可能是不可移植的(不确定存储大小是否在POSIX或其他一些标准或实现中指定)。

f77是哪种编译器?它是什么包装的?这些本质是非标准的,甚至不是f90,而是完全非标准的。不是每个编译器都知道它们。