2016-03-01 1 views
1

Я не могу понять, почему это не работает.Неопределенная ссылка на функцию Fortran в C++

/* main.cpp */ 
#include <stdio.h> 
extern "C" 
{ 
    int __stdcall inhalf(int *); 
} 
int main() 
{ 
    int toHalf = 2; 
    int halved = inhalf(&toHalf); 
    printf("Half of 2 is %d", halved); 
    return 0; 
} 

Хорошо, хорошо выглядит.

$ g++ -c main.cpp 

Нет ошибок.

! functions.f90 
function inhalf(i) result(j) 
    integer, intent(in) :: i 
    integer    :: j 
    j = i/2 
end function inhalf 

Я уверен, что это правильно.

$ gfortran -c functions.f90 

До сих пор так хорошо ...

$ gcc -o testo main.o functions.o 
main.o:main.cpp:(.text+0x24): undefined reference to `[email protected]' 
collect2.exe: error: ld returned 1 exit status 

Я смотрел это вверх в течение часа, но я не мог найти ничего, что работал для этого случая. Как мне это решить?

+2

'inhalf' в fortran будет называться' inhalf_' в c. – BoBTFish

+0

'inhalf @ 4' указывает, что для объявления функции' inhalf() 'все еще есть нежелательное манипулирование. –

+0

Используйте тег [tag: fortran] для вопроса Fortran. Добавьте определенную версию, если необходимо, чтобы ее отличить. –

ответ

0

Для полной совместимости C вы можете использовать bind особенность современного Фортрана:

! functions.f90 
function inhalf(i) result(j) bind(C,name='inhalf') 
    integer, intent(in) :: i 
    integer    :: j 
    j = i/2 
end function inhalf 

Это позволяет дать имя функции, которую можно использовать в C (и другие), не полагаясь на именование схема, используемая вашим компилятором сама по себе.

__stdcall Только Win32 (и поведение по умолчанию для ссылки, см. here). Вы можете безопасно удалить его. [На самом деле это требуется для компиляции вашего кода в Linux. ]

+0

Я предполагаю, что все еще останется проблема с stdcall. –

+0

Да, я посмотрел, что только знаю ... –

+0

@ VladimirF stdcall issue? I попробовал это, и это сработало. – robbie0630