компиляция — вызов подпрограммы на Фортране из C ++, неопределенная ссылка при компоновке

У меня есть подпрограмма на Фортране, которую я хотел бы вызвать из программы на 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

Как правильно вызывать эту функцию на Фортране?

3

Решение

Похоже, ваш extern "C" Объявление находится внутри определения функции или класса. Это недопустимо — оно должно быть на верхнем уровне в исходном файле. (Да, сообщение об ошибке может быть более информативным!)

5

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


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