Я читал этот так вопрос: Связывание двоичных файлов с помощью fortran и c ++ с использованием gcc.
Может кто-нибудь объяснить, если это возможно сделать аналогичные вещи с Fortran 77 с C ++?
Мне нужно извлечь некоторые подпрограммы из файлов Fortran 77 и превратить их в C ++ DLL. Вновь созданная DLL должна работать со старыми файлами Fortran 77.
Некоторые пошаговые объяснения о том, как связать & скомпилируйте файл fortran 77 с помощью c ++ dll. Я много искал и я новичок в смешанном программировании.
Это для фортрановской программы, вызывающей C ++. Обратите внимание, что интерфейсы должны быть во внешнем «C», иначе компоновщик их не найдет.
1) Создайте подпрограмму C с именем worker.cpp. Обратите внимание на заключительное подчеркивание после имени процедуры.
#include <iostream>
extern "C"{
extern void __attribute__((stdcall)) worker_()
{
std::cout << "Hey it works" << std::endl;
}
}
2) Создайте программу на фортране с именем boss.for. Обратите внимание, что при вызове подпрограммы Си нет завершающего подчеркивания.
program main
external worker
print *, 'Calling C'
call worker
print *, 'Back to F77'
stop
end
3) Скомпилируйте код C
g++ -c worker.cpp
4) Скомпилировать и связать код Fortran
gfortran boss.for worker.o -o fboss -L/usr/lib -lstdc++
Связать C ++ с программой на Фортране практически невозможно из-за искажения имени, если только все не находится внутри внешнего «C». В качестве альтернативы вы можете сделать интерфейс extern «C» и реализацию C ++.
Вот как можно связать существующую библиотеку Фортрана с программой на C ++, о чем и другая статья.
1) Создать подпрограмму на Фортране, скажем, worker.for. Это F77, так что помните 6 ведущих пробелов
subroutine printhi
print *, 'it works'
end subroutine
2) Создайте программу на C ++, которая ее вызывает, скажем, boss.cpp. Обратите внимание на заключительное подчеркивание в имени рутины на Фортране
#include <iostream>
// Avoid any name mangling
extern "C"{
extern void __attribute__((stdcall)) printhi_(void);
}
int main()
{
std::cout << "Calling fortran" << std::endl;
printhi_();
std::cout << "Returned to C++" << std::endl;
}
3) Сборка рутины F77
gfortran -c worker.for
4) Сборка и компоновка программы на C ++. Добавьте библиотеку fortran для разрешения любых битов, специфичных для fortran.
g++ boss.cpp worker.o -o cboss -L/usr/lib -lgfortran
5) Запустите программу
./a.out