Linker 在OS X 10.6.4中针对混合C和Fortran进行链接时未定义的符号

Linker 在OS X 10.6.4中针对混合C和Fortran进行链接时未定义的符号,linker,gfortran,gcc4,Linker,Gfortran,Gcc4,我试图编译一段代码(不是我的),它由混合的Fortran和C源文件组成,这些文件被编译到一个库中。该库可以直接链接到python类,也可以(更有效地)从python类驱动。我以前使用g77和gcc成功地构建了32位的代码,但是我遇到了一种情况,代码使用了大量内存,需要64位 我尝试使用gfortran 4.2.3(与AT&T R项目的二进制距离)和系统gcc(4.2)将其构建为仅64位或通用二进制。源文件构建正确,但当我尝试链接库时,许多Fortran函数会出现许多“未定义符号”错误。库上的nm

我试图编译一段代码(不是我的),它由混合的Fortran和C源文件组成,这些文件被编译到一个库中。该库可以直接链接到python类,也可以(更有效地)从python类驱动。我以前使用g77和gcc成功地构建了32位的代码,但是我遇到了一种情况,代码使用了大量内存,需要64位

我尝试使用gfortran 4.2.3(与AT&T R项目的二进制距离)和系统gcc(4.2)将其构建为仅64位或通用二进制。源文件构建正确,但当我尝试链接库时,许多Fortran函数会出现许多“未定义符号”错误。库上的nm显示符号似乎存在,但显然链接器没有找到它们

以下是两个(许多)编译命令(不会产生错误):

以及链接步骤,它轰炸:

gcc -o sfac sfac.c stoken.c -I/Users/keriksen/Research/atomic_data/fac -I/Users/keriksen/Research/atomic_data/fac/faclib -O2 -fPIC -fno-strength-reduce -fno-common -L/Users/keriksen/Research/atomic_data/fac -lfac -lm -lgfortran -lgcc
未定义符号示例:

  "_acofz1", referenced from:
      _HydrogenicDipole in libfac.a(coulomb.o)
      _HydrogenicDipole in libfac.a(coulomb.o)
以及表示符号存在的相应nm:

    niobe:atomic_data/fac[14] nm libfac.a | grep acof

0000000000000000 T _acofz1_
0000000000002548 S _acofz1_.eh
                 U _acofz1
我是在做一些愚蠢的事情,比如没有必要切换到链接器,还是这里发生了一些更微妙的事情?

按照Yuji的建议:

处理C/Fortran兼容性问题的cfortran.h头文件(可在Web上获得,并且显然使用得相当广泛)并不能直接处理gfortran。我(错误地)破解了它,忽略了这个事实,并为我的傲慢付出了代价

具体的问题是gfortran发出的目标代码包含带有尾随下划线的符号,而gcc没有

正确的做法是将环境变量CPPFLAGS设置为-Df2cFortran。一旦设置了这个宏,cfortran.h就会在调用C函数的目标代码中的符号中添加必要的下划线,链接器会很高兴

在这个特定的实例中,另一件令人惊讶的事情是configure脚本在F77环境变量中查找fortran编译器的名称。一旦我将F77设置为“/usr/local/bin/gfortran-arch x86_64”,生成的Makefile就正确了,它只生成64位的目标代码。我不确定这是标准的配置行为,还是这个特定脚本的一个特性

结果是,我现在有了一个64位共享库,它可以很好地与我下载的64位python配合使用。我正在考虑返回并尝试创建一个可以与系统python一起使用的通用库,但我不确定我是否想尝试命运。

Per Yuji的建议:

处理C/Fortran兼容性问题的cfortran.h头文件(可在Web上获得,并且显然使用得相当广泛)并不能直接处理gfortran。我(错误地)破解了它,忽略了这个事实,并为我的傲慢付出了代价

具体的问题是gfortran发出的目标代码包含带有尾随下划线的符号,而gcc没有

正确的做法是将环境变量CPPFLAGS设置为-Df2cFortran。一旦设置了这个宏,cfortran.h就会在调用C函数的目标代码中的符号中添加必要的下划线,链接器会很高兴

在这个特定的实例中,另一件令人惊讶的事情是configure脚本在F77环境变量中查找fortran编译器的名称。一旦我将F77设置为“/usr/local/bin/gfortran-arch x86_64”,生成的Makefile就正确了,它只生成64位的目标代码。我不确定这是标准的配置行为,还是这个特定脚本的一个特性


结果是,我现在有了一个64位共享库,它可以很好地与我下载的64位python配合使用。我正在考虑返回并尝试生成一个可以与系统python一起工作的通用库,但我不确定我是否想尝试命运。

U\U acofz1
意味着
\U acofz1
未定义。定义的是
T\u acofz1\u
,后面还有一个
\u
。请独立更新至10.6.8。很抱歉我帮不了你。。。有没有再现问题的源代码,我们可以在这里编译以查看更多问题?实际上,你帮了不少忙,Yuji。缺少尾随的“904;”(我不敢相信我错过了——我已经看了太久的代码)是关键。最初的作者使用了一个名为cfortran.h的头文件来处理C/Fortran接口。它不支持gfortran,我用来编译代码的方法也不正确。对于该记录,当将cfortran.h与gfortran一起使用时,请确保在编译时设置了-Df2cFortran标志。(我在环境变量CPPFLAGS中设置了它)。cfortran.h CPP宏将添加必要的尾随下划线。你为什么不自己编写一个aswer呢,克里斯?这可能有助于通过Google/Bing找到此条目的其他人。
U\U acofz1
表示
\U acofz1
未定义。定义的是
T\u acofz1\u
,后面还有一个
\u
。请独立更新至10.6.8。很抱歉我帮不了你。。。有没有再现问题的源代码,我们可以在这里编译以查看更多问题?实际上,你帮了不少忙,Yuji。缺少尾随的“904;”(我不敢相信我错过了——我已经看了太久的代码)是关键。最初的作者使用了一个名为cfortran.h的头文件来处理C/Fortran接口。它不支持gfortran,我用来编译代码的方法也不正确。对于该记录,当将cfortran.h与gfortran一起使用时,请确保在编译时设置了-Df2cFortran标志。(我在环境变量CPPFLAGS中设置了它)。cfortran.h CPP宏将添加必要的尾随下划线。你为什么不自己编写一个aswer呢,克里斯?这可能会帮助其他通过谷歌/必应找到此条目的人。
    niobe:atomic_data/fac[14] nm libfac.a | grep acof

0000000000000000 T _acofz1_
0000000000002548 S _acofz1_.eh
                 U _acofz1