Смешанное программирование не удалось в выпуске, но удалось отладить

В моем компиляторе функция с именем «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

Почему это произошло? Я поместил все эти коды в одно и то же решение. Так что конфигурация та же.


person John    schedule 14.06.2013    source источник
comment
We all know that a function named "func" will be renamed as _FUNC@* after compiling in fortran НЕТ! НЕТ! НЕТ! Это сильно зависит от компилятора и системы.   -  person Vladimir F    schedule 14.06.2013
comment
Кроме того, как я уже говорил вам ранее, VS2010 - это РЕДАКТОР, вы должны сказать, какой КОМПИЛЯТОР вы используете!   -  person Vladimir F    schedule 14.06.2013
comment
Спасибо за вашу рекомендацию. На самом деле я не инженер. Извините за такое произвольное суждение.   -  person John    schedule 14.06.2013


Ответы (1)


Во-первых, обратите внимание, что ваша функция C — это SUBPRINT, а не subprint, что ДЕЙСТВИТЕЛЬНО имеет значение даже внутри C.

Во-вторых, вы должны использовать __cplusplus, а не _cplusplus

В-третьих, просто используйте современный Fortran для взаимодействия с C:

c.cc:

#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
  void subprint(){
   printf("hello the world\n");
  }
#ifdef __cplusplus
}
#endif

f.f90:

program main
implicit none

interface
  subroutine subprint() bind(C,name="subprint")
  end subroutine
end interface

call subprint()
read(*,*)
endprogram

gfortran c.cc f.f90

./a.out
hello the world
person Vladimir F    schedule 14.06.2013
comment
Я уже решил это. Fortran-›внешняя процедура-›соглашение о вызовах-›cvf - person John; 17.06.2013
comment
Обязательно возникнут проблемы со следующим изменением компилятора. - person Vladimir F; 17.06.2013