我正在尝试编译由混合的 Fortran 和 C 源文件组成的代码(不是我的),这些文件被编译成一个库。这个库既可以直接链接,也可以(更有用)从 python 类驱动。我之前使用g77和gcc成功地将代码构建为32位,但是我遇到了代码使用大块内存的情况,并且需要是64位的。
我尝试使用 gfortran 4.2.3(来自 AT&T R 项目的二进制文件)和系统 gcc(4.2)构建 64 位或通用二进制文件。源文件构建正确,但是当我尝试链接库时,我收到许多 Fortran 函数的“未定义符号”错误。库上的 nm 显示符号似乎存在,但显然链接器没有找到它们。
以下是两个(许多)编译命令(不会产生错误):
/usr/local/bin/gfortran -arch ppc -arch i386 -arch x86_64 -fPIC -fno-strength-reduce -fno-common -ff2c -Wall -c lsame.f
gcc -c -I/Users/keriksen/Research/atomic_data/fac -I/Users/keriksen/Research/atomic_data/fac/faclib -O2 -fPIC -fno-strength-reduce -fno-common pmalloc.c
和链接步骤,炸弹:
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
我是在做一些愚蠢的事情,比如不包括对链接器的必要切换,还是这里发生了一些更微妙的事情?