Итак, я пытаюсь связать два простых кода: один на 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_'
Ни один из примеров, которые я видел уже сделал ссылку на Фортране код к программе C++, в то время как они использовали ту же самую структуру, чтобы заложить все из.
Ненормированные имена сами предполагают, что вы не знакомы с функциональностью Fortran с функциями C *. Попросите об этом пометить 'fortran-iso-c-binding' и посмотрите, что вы можете узнать. –
Используйте тег fortran для всех вопросов Фортрана. Fortran 90 довольно старый и устаревший. –
@VladimirF Как я хочу, чтобы вы были совершенно правы. Я, конечно же, хочу, чтобы F90 был старым и устаревшим, вместо того, чтобы быть этой «новомодной» вещью, которую мы с коллегой стараемся медленно перенести в наш основной инструмент оптимизации орбитальной орбиты/траектории нашей компании. Такие края кровотечения являются модулями и определенными пользователем типами! Нет, нам лучше использовать нашу кодовую базу, основанную на тоннах ОБЩИХ переменных (хотя я должен сказать, что они, по крайней мере, организованы в файлы include). О, и это не был код из 70-х годов, это было написано в 2002 году. –