2016-07-05 24 views
2

因此,我正在尝试链接两个简单代码,一个使用C++,另一个使用Fortran90。我已经花了最后几天环顾网络,我看到的一切使它看起来像我在做什么应该工作,但我在这里很明显,它不是。下面是我有链接C++和Fortran90代码时的错误

C++代码:BasicFusion.cpp

#include <iostream> 
#include <fstream> 
using namespace std; 

extern "C" 
{ 
    void Fusion_(double *T, double *dens); 
} 

void Fusion_(double *T, double *dens) 
{ 
    double dT; 
    FILE *fp; 
    fp = fopen("Temp.dat","a"); 

    dT = *dens * 1.46e-9; 
    *T = *T + dT; 

    cout << "The new Temperature is: " << T << endl; 
    fprintf(fp, "%f \n" T); 
    fclose(fp); 
} 

Fortran代码:BasicHydro.f90

program BasicHydro 
implicit none 

double precision :: R 
double precision :: rho 
double precision :: T = 1.0d4 
double precision :: M = 2.0d30 
double precision :: G = 6.67d-11 
double precision :: k = 1.381d-23 
double precision :: pi = 3.14159265359d0 
integer :: i 

do i=1,10,1 
    open(1,file='density.dat',action='write',position="append") 
    R = (75/(4*pi))*((k*T)/(G))**2 

    write(*,*) 'The new density is',rho 

    write(1,*) rho 
    close(1) 
    call Fusion(T,rho) 
end do 
end program BasicHydro 

在命令行我输入:

>g++ -c BasicFusion.cpp 
>gfortran -c BasicHydro.f90 
>gfortran -o HydroThermo BasicFusion.o BasicHydro.o -lstdc++ 

我也用ifort代替gfortran使用相同的标签和文件。在这两种情况下,我得到了同样的错误:

BasicHydro.o: In function `MAIN__': 
BasicHydro.f90:(.text+0x27d): undefined reference to `fusion_' 

我见过的已经取得了Fortran代码到C++程序的引用的例子没有,而他们已经使用了相同的结构,一切铺陈。

+2

自己处理名称表明您不熟悉Fortran *与C *功能的互操作性。在标签'fortran-iso-c-binding'周围捅一下,看看你能学到什么。 –

+0

对所有Fortran问题使用标签fortran。 Fortran 90已经很陈旧了。 –

+0

@VladimirF我多么希望你完全正确。我当然希望F90是陈旧过时的,而不是这个“新奇”的东西,我和一个同事试图慢慢地将我们公司的主要轨道传播/轨迹优化工具移植到。这种出血边缘的特征就像模块和用户定义的类型一样!不,我们最好继续使用建立在大量COMMON变量之上的代码库(尽管我应该说至少它们被组织在包含文件中)。哦,这不是70年代的代码,这是在2002年写的。 –

回答

1

所以,我的顾问刚刚停下来,经过一些其他文档后,似乎由于Fortran不依赖于案例,它会自动将所有内容都设置为小写。因为我已经用大写字母F定义了Fusion,所以C++对象文件将它与上面的F一起使用。所以当我试图运行整个东西时,fortran部分正在寻找融合,而C++部分只有融合... ...

故事的寓意:所有的时间都要小写。

+5

有时候大写,有时候它会添加各种装饰...使用'bind(C,name =)'保持便携性。 –