链接 C++ 和 Fortran90 代码时出错
Errors while linking C++ and Fortran90 code
所以我正在尝试 link 两个简单的代码,一个用 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_'
None 我见过的示例在 fortran 代码中引用了 C++ 程序,同时它们使用相同的结构来布置所有内容。
所以我的顾问刚刚停下来,在浏览了一些其他文档后,似乎由于 Fortran 不依赖于大小写,它会自动将所有内容变为小写。因为我用大写字母 F 定义了 Fusion,所以 C++ 目标文件用大写字母 F 定义了它。所以当我尝试 运行 整个事情时,fortran 部分正在寻找融合,而 c++ 部分只有 Fusion。 ..
故事的寓意:始终将所有内容设为小写。
所以我正在尝试 link 两个简单的代码,一个用 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_'
None 我见过的示例在 fortran 代码中引用了 C++ 程序,同时它们使用相同的结构来布置所有内容。
所以我的顾问刚刚停下来,在浏览了一些其他文档后,似乎由于 Fortran 不依赖于大小写,它会自动将所有内容变为小写。因为我用大写字母 F 定义了 Fusion,所以 C++ 目标文件用大写字母 F 定义了它。所以当我尝试 运行 整个事情时,fortran 部分正在寻找融合,而 c++ 部分只有 Fusion。 ..
故事的寓意:始终将所有内容设为小写。