2016-02-17 2 views
1

Я хотел бы знать, как я могу получить программу на C, чтобы вызвать подпрограмму Fortran 90, содержащуюся с модулем Fortran 90.Вызов подпрограммы в модуле из C

This question deals with a similar problem, и я пытаюсь реализовать это решение, но у меня все еще возникают проблемы.

Здесь приведены примеры игрушек testC.c файла, который содержит основную функцию, и файл модуля testF.f90, который содержит подпрограмму Fortran 90.

testC.c

#include <stdlib.h> 
#include <stdio.h> 

extern void __testF_MOD_fortfunc(int *,float *); 

int main() { 
    int ii=5; 
    float ff=5.5; 

    __testF_MOD_fortfunc(&ii, &ff); 

    return 0; 
} 

testF.f90

module testF 

contains 

subroutine fortfunc(ii,ff) 
    implicit none 

    integer ii 
    real*4 ff 

    write(6,100) ii, ff 
    100 format('ii=',i2,' ff=',f6.3) 

    return 
end subroutine fortfunc 

end module testF 

Для компиляции, я использую следующие строки

gcc -c testC.c 
gfortran -o testF.f90 
gcc -o test testF.o testC.o -lgfortran 

Я получаю сообщение об ошибке

testC.o: In function `main': 
testC.c:(.text+0x27): undefined reference to `__testF_MOD_fortfunc' 
collect2: error: ld returned 1 exit status 
+0

Я обновил свой вопрос, чтобы уточнить проблему. А именно, он не выполняется при компиляции и говорит: «Неопределенная ссылка на __testF_MOD_fortfunc – DJames

+0

Порядок, в котором файлы перечислены, относится к компоновщику. Это может решить вашу проблему, чтобы обменять testC.o и testF.o в вашу ссылку. –

+0

Пробная замена testC .o и testF.o. Не повезло, к сожалению. – DJames

ответ

3

Вы можете использовать objdump -t testF.o для непосредственного считывания имени функции из объекта. Это показывает следующую строку:

0000000000000000 g  F .text 00000000000000b4 __testf_MOD_fortfunc 

Это ваше имя функции. Вы можете видеть, что это testf в нижнем регистре. Использование этого кода C должно решить вашу проблему.

Однако эти соглашения об именах зависят от компилятора. Вы действительно должны взглянуть на модуль ISO_C_binding и улучшенную совместимость C современного Fortran.

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