我被告知要在stackoverflow上发布编译问题,所以这是我对Ubuntu提问posted的问题!:
我正在尝试编译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),它们都会导致更多错误。
我的问题是如何使用fg程序获取getgid,getuid和fdate?我还感到困惑,因为有getgid和getuid手册页但在ubuntu上没有安装?
我有一个64位14.04 LTS安装。
感谢任何想法。
答案 0 :(得分:2)
默认情况下,gfortran(以及其他Fortran编译器)通过添加下划线来破坏过程名称。在源代码中引用getgid
时,编译器会将其更改为getgid_
。如果函数getgid
未在Fortran源中定义,例如在C中,这将导致链接错误,例如您遇到的错误。
函数getgid
,getuid
等不是Fortran函数,它们是标准的C库函数。如果您使用的代码来自其他地方,请查看提供的Makefile是否列出了禁用Fortran默认强调的选项。对于gfortran,此选项为-fno-underscoring
。将其附加到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_t
,尽管长链的typedef最终与文件/usr/include/bits/types.h
和/usr/include/bits/typesizes.h
中的真实类型相关,作为无符号32位整数。 Fortran没有无符号类型,因此当存储大小匹配时,如果这些函数返回大约20亿以上的值,它们将在Fortran中被误解为负值。此外,由于gid_t
的存储类型是在"位"中定义的。 C头树,它们可能是不可移植的(不确定存储大小是在POSIX中指定还是依赖于某些其他标准或实现)。