【发布时间】:2016-02-06 19:55:40
【问题描述】:
我正在尝试编写一个调用一段 fortran 代码的 C 函数。我认为尝试直接链接 fortran 代码比尝试将 fortran 重写为 C 更容易。我在直接下载二进制文件并安装它们的 mac 上使用 gcc/g++/gfortran。
fortran 代码位于https://www.ngdc.noaa.gov/IAGA/vmod/igrf12.f。我要调用的具体子程序是subroutine igrf12syn (isv,date,itype,alt,colat,elong,x,y,z,f)
我写的包装如下:
#include <stdio.h>
extern void igrf12syn( int *isv, double *year, double *itype, double *alt,
double *colat, double *elong, double* x,double* y, double* z, double* f );
int main(){
double B[4], BabsDervs[3], BrDervs[3], BthDervs[3], BphDervs[3];
double r, th, ph,year,alt2,lat,colat,elong,x,y,z,f;
int isv;
// igrf12syn (isv,date,itype,alt,colat,elong,x,y,z,f)
r = 6371e3;
th = 0.57;
ph = 0;
year = 2015;
alt2 = 200.0;
lat = 33.25;
colat = 90.0-lat;
elong = 0.0;
isv =1;
igrf12syn_(&isv,&year,&isv,&r, &th, &ph,x,y,z,f);
printf("%0.4e",f);
return 0;
}
我用来编译和调用它的命令是:
/usr/local/bin/gcc -lgfortran -c testigrf.c igrf12.f
/usr/local/bin/gcc -lgfortran -o b.out testigrf.o igrf12.o
我得到的错误是:
duplicate symbol _main in:
testigrf.o
igrf12.o
ld: 1 duplicate symbol for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [igrf] Error 1
我了解此错误的含义,我可以为 .o 文件生成 nm 文件,其中显示了 main 两个函数。但是,我不确定如何更改 Fortran 代码以消除此错误。
所以我的问题如下:
1. 如何更改 Fortran 或 C 代码来解决此问题?特别是,由于 fortran 代码以 PROGRAM IGRF
- 我是否正确调用了
igrf12syn例程?我担心我没有正确调用它。我也可能在传递变量方面做得不好,这必须通过引用来完成。
感谢您的帮助,如果我在调用例程时做了一些非常愚蠢的事情,请告诉我。
【问题讨论】:
-
没有语言 C/C++,只有两种不同的语言 C 和 C++!你的代码看起来像 C。
-
不要发布链接。一个问题必须是独立的。另请注意,您的问题包含离题问题,过于宽泛且缺乏信息。阅读How to Ask。
-
该链接已发布,因为我认为将所有代码复制到此帖子中是不值得的。
igrf12.f属于公共领域。将编辑出问题 3。 -
另外,我知道 C 和 C++ 是两种不同的语言。但是你可以使用 g++ 和适当的头文件来编译 C 代码。
-
不,你不能。您可以使用比您想象的更小的通用子集。然而,告诉你不同的是,他们至少不知道他们中的哪些人足以写出比“Hello world”更多的东西。相同的语法并不意味着相同的语义。
标签: c gcc compiler-errors fortran gfortran