У меня есть подпрограмма на Фортране, которую я хотел бы вызвать из программы на C ++. Он принимает длинный список аргументов с плавающей запятой и использует встроенный модуль iso_c_binding:
subroutine parasolve ( ...... ) bind (c, name='c_parasolve')
use,intrinsic :: iso_c_binding
implicit none
....
Исходя из того, что я прочитал, я понимаю, что мне нужно использовать команду «extern» в C ++, чтобы определить внешнюю функцию, прежде чем вызывать ее позже. Я попробовал это двумя способами. Первый:
extern "C" void c_parasolve( .... );
возвращает «ожидаемый неквалифицированный идентификатор перед строковой константой» во время компиляции, тогда как второй:
extern void c_parasolve( .... );
компилируется просто отлично, но не может связать с «неопределенной ссылкой на ‘c_parasolve (….)'» и ld возвращает 1.
Я собираю с:
g++ -c main.cpp
и т. д., и
gfortran -ffree-form -std=f2003 -c parasolve.f03
чтобы получить их в .o ELFs, а затем пытается связать с:
g++ main.o otherfiles.o parasolve.o -lgfortran
Как правильно вызывать эту функцию на Фортране?
Похоже, ваш extern "C"
Объявление находится внутри определения функции или класса. Это недопустимо — оно должно быть на верхнем уровне в исходном файле. (Да, сообщение об ошибке может быть более информативным!)