2016-07-05 2 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_' 

Ни один из примеров, которые я видел уже сделал ссылку на Фортране код к программе C++, в то время как они использовали ту же самую структуру, чтобы заложить все из.

+2

Ненормированные имена сами предполагают, что вы не знакомы с функциональностью Fortran с функциями C *. Попросите об этом пометить 'fortran-iso-c-binding' и посмотрите, что вы можете узнать. –

+0

Используйте тег fortran для всех вопросов Фортрана. Fortran 90 довольно старый и устаревший. –

+0

@VladimirF Как я хочу, чтобы вы были совершенно правы. Я, конечно же, хочу, чтобы F90 был старым и устаревшим, вместо того, чтобы быть этой «новомодной» вещью, которую мы с коллегой стараемся медленно перенести в наш основной инструмент оптимизации орбитальной орбиты/траектории нашей компании. Такие края кровотечения являются модулями и определенными пользователем типами! Нет, нам лучше использовать нашу кодовую базу, основанную на тоннах ОБЩИХ переменных (хотя я должен сказать, что они, по крайней мере, организованы в файлы include). О, и это не был код из 70-х годов, это было написано в 2002 году. –

ответ

1

Так что мой советник просто остановился и после прохождения какой-либо другой документации выяснилось, что, поскольку Fortran не зависит от случая, он автоматически делает все в нижнем регистре. Поскольку я определил Fusion с верхним регистром F, объектный файл C++ имел его с верхним F. Поэтому, когда я пытался запустить все это, часть fortran искала слияние, а часть C++ имела только Fusion ...

мораль истории: все время делайте все в нижнем регистре.

+5

И иногда капитал, а иногда и добавляет различные украшения ... Используйте 'bind (C, name =)', чтобы оставаться портативным. –

Смежные вопросы