В моем компиляторе функция с именем «func» будет переименована в _FUNC@* после компиляции в фортране. И если код c использует соглашение о вызовах _stdcall, то имя функции, например. Ab, после компиляции будет переименован в _Ab@*. Таким образом, это может привести к краткому методу смешанного программирования между fortran и c. Ниже приведен мой код. источник1.f90
program main
implicit none
call subprint()
read(*,*)
endprogram
ccode.c
#include <stdio.h>
#ifdef _cplusplus
extern "C" {
#endif
void _stdcall SUBPRINT()
{printf("hello the world\n");}
#ifdef _cplusplus
}
Моя платформа Win 7 и используется vs2010. Компилятор визуальный С++. ccode.c сгенерирует .lib, и проект fortran будет использовать его. И это будет успешно работать в режиме отладки. Но когда я переводил проект в режим выпуска, возникали ошибки. Ошибки являются основной функцией в Source1.f90, не могу найти _SUBPRINT. Обратите внимание, что я уже сгенерировал .lib в режиме выпуска и добавил его в проект fortran.
Другой метод смешанного программирования — использование соглашения о вызовах _cdecl. Следующие коды будут успешно работать как в режиме отладки, так и в режиме выпуска.
module abc
interface
subroutine subprint()
!dec$ attributes C,alias:'_subprint'::subprint
end subroutine
end interface
end module
program main
use abc
implicit none
call subprint()
read(*,*)
endprogram
Вот код С. Соглашение о вызовах по умолчанию — просто _cdecl.
#ifdef _cplusplus
extern "C" {
#endif
void subprint()
{printf("hello the world\n");}
#ifdef _cplusplus
}
#endif
Почему это произошло? Я поместил все эти коды в одно и то же решение. Так что конфигурация та же.
We all know that a function named "func" will be renamed as _FUNC@* after compiling in fortran
НЕТ! НЕТ! НЕТ! Это сильно зависит от компилятора и системы. - person Vladimir F   schedule 14.06.2013