2013-10-13 5 views
1

Я пытаюсь использовать FORtran подпрограмму модуля в C и не могу пройти, вот упрощенная версия моей проблемы:Как использовать FORtran подпрограмму модуля в с

У меня есть один FORtran модуля, который содержит подпрограмму , а вторая подпрограмма использует модуль.

!md.f90 
module myadd 
implicit none 
contains 

subroutine add1(a) bind(c) 
implicit none 
integer a 
a=a+1 

end subroutine add1 
end module myadd 


!sb.f90 
subroutine sq(a) bind(c) 
use myadd 
implicit none 
integer a 
call add1(a) 
a=a*a 
end subroutine sq 

Теперь я хочу, чтобы вызвать функцию sb в C:

//main.cpp 
extern "C"{ void sb(int * a); } 
int main(){ 
    int a=2; 
    sb(&a); 
} 

как я должен соединить их вместе?

Я пытался что-то вроде

ifort -c md.f90 sb.f90 
icc sb.o main.cpp 

но дает ошибку

sb.o: В функции sq': sb.f90:(.text+0x6): undefined reference to add1' /tmp/icc40D9n7.o: В функции main': main.cpp:(.text+0x2e): undefined reference to сб»

Кто-нибудь знает, как решить проблему?

+0

Возникает вопрос: http://stackoverflow.com/questions/15557439/how-to-call-a-fortran90-function-included-in-a-module-in-c-code – Jason

ответ

3
int main(void){ 
    int a=2; 
    sb(&a); 
    return 0; 
} 

и

module myadd 
use iso_c_binding 
implicit none 
contains 

subroutine add1(a) bind(c) 
implicit none 
integer (c_int),intent (inout) :: a 
a=a+1 

end subroutine add1 
end module myadd 


!sb.f90 
subroutine sq(a) bind(c, name="sb") 
use iso_c_binding 
use myadd 
implicit none 
integer (c_int), intent(inout) :: a 
call add1(a) 
a=a*a 
end subroutine sq 

с

gcc -c main.c 
gfortran-debug fort_subs.f90 main.o 

Это легче связать с Fortran компилятор, поскольку он приносит в Фортране библиотеках.

+0

Это работает. Большое спасибо! Вы знаете, как сделать то же самое с помощью компиляторов Intel? Я всегда получаю сообщение об ошибке с intel: main.o: В функции 'main ': main.c :(. Text + 0x0): множественное определение' main' for_main.o:/export/users/nbtester/efi2linux_nightly/branch -13_0/20120801_000000/libdev/frtl/src/libfor/for_main.c :(. Text + 0x0): сначала определяется здесь /home/compilers/Intel/composer_xe_2013.0.079/compiler/lib/intel64/for_main.o: В function 'main ': /export/users/nbtester/efi2linux_nightly/branch13_0/20120801_000000/libdev/frtl/src/libfor/for_main.c:(.text+0x38): неопределенная ссылка на« MAIN__ » – xslittlegrass

+2

@xslittlegrass, если вы используете 'ifort' для связывания кода Fortran с функцией C/C++' main() ', вы должны указать ему параметр' -nofor-main', иначе компилятор свяжет объектный файл 'for_main.o', который содержит функция «main», которая, в свою очередь, вызывает основную программу Fortran (обычно называемую «MAIN» под капотом). –

+0

@HristoIliev Это работает! Благодарю.Вы, какой флаг компилятора для icc запрашивать icc, чтобы включить библиотеку fortran? – xslittlegrass

1

Причина вашей ошибки связи двояко:

  • вы опустили объектный файл для исходного файла, который содержит модуль из окончательной командной строки (md.o).

  • Вы набрали sq в fortran sb в коде C++.

Исправить это, и вы будете в порядке.

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