【发布时间】:2016-07-05 17:22:29
【问题描述】:
所以我正在尝试链接两个简单的代码,一个在 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++ 程序,而它们使用相同的结构来布置所有内容。
【问题讨论】:
-
自行修改名称表明您不熟悉 Fortran 的 与 C 的互操作性 特性。戳一下标签
fortran-iso-c-binding,看看你能学到什么。 -
对所有 Fortran 问题使用标记 fortran。 Fortran 90 已经过时了。
-
@VladimirF 我多么希望你是完全正确的。我当然希望 F90 是旧的和过时的,而不是成为我和一位同事正在尝试将我们公司的主要轨道传播/轨迹优化工具缓慢移植到的“新奇”事物。诸如模块和用户定义类型之类的前沿功能!不,我们最好继续使用基于大量 COMMON 变量构建的代码库(尽管我应该说至少它们被组织在包含文件中)。哦,这不是 70 年代的代码,这是 2002 年编写的。
-
@JavierMartín 我想说 F90 的“旧”可以通过这个矩阵的绿色覆盖来判断:fortranwiki.org/fortran/show/Fortran+2003+status,这可能不会涵盖所有相关的编译器,可能包括一些不太相关的编译器相关,但它提供了对 F2003 支持的一个很好的想法。只要像 GNU 这样的主要编译器不完全支持 F2003,F90 就不会过时,我同意。但是,正如您所见,iso-c-binding 基本上是所有编译器都支持的...