gcc — связывание программы Fortran 77 с dll на C ++

Я читал этот так вопрос: Связывание двоичных файлов с помощью fortran и c ++ с использованием gcc.

Может кто-нибудь объяснить, если это возможно сделать аналогичные вещи с Fortran 77 с C ++?
Мне нужно извлечь некоторые подпрограммы из файлов Fortran 77 и превратить их в C ++ DLL. Вновь созданная DLL должна работать со старыми файлами Fortran 77.

Некоторые пошаговые объяснения о том, как связать & скомпилируйте файл fortran 77 с помощью c ++ dll. Я много искал и я новичок в смешанном программировании.

1

Решение

Это для фортрановской программы, вызывающей 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++
0

Другие решения

Связать 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
0

По вопросам рекламы [email protected]