C / C ++, FORTRAN, sublinhados e ferramentas automáticas GNU

Tenho uma pergunta sobre programação em linguagem mista (C / C ++ e FORTRAN) usando gcc e gfortran. Pesquisei bastante "misturando fortran com o idioma X" e não consegui resolver isso.

Não tenho certeza se este é um problema de vinculação ou um problema de compilador, ou ambo

Criei três arquivos e estou usando o GNU Autotools para criar o aplicativo bruto, mas deve poder criar o aplicativo a partir da linha de comando de forma independent

arquivo C (main.c) será o aplicativo de direção, que chama várias funções do FORTRAN:

/* this is a simple program */

#include <stdio.h>

/* add the extern function definition */
#include "fooonly.h" 

// this is not working for the mixed language programming stuff yet... 

/* this is the main program section */
int main( int argc, char *argv[] )
{
   int a = 36;
   int b = 24;
   int c = 0;

   printf( "hi mom\n" );

   /* now call a FORTRAN function from C */
   c = NGCD( &a, &b );
   printf( "NGCD(%d,%d)=%d\n", a, b, c );

   return 0;

}

A função fortran que geralmente contém o FORTRAN 77 (mas também pode incluir o código FORTRAN90 / 95) se parece com:

c$$      The following introductory example in FORTRAN 77 finds the
c$$     $     greatest common divisor for two numbers A and B using a
c$$     $     verbatim implementation of Euclid's algorithm.

      FUNCTION NGCD(NA, NB)
      IA = NA
      IB = NB
 1    IF (IB.NE.0) THEN
         ITEMP = IA
         IA = IB
         IB = MOD(ITEMP, IB)
         GOTO 1
      END IF
      NGCD = IA
      RETURN
      END

Using Dev. Studio 6 / Compaq Digital Fortran 6.0, isso funciona bem. Na verdade, não preciso usar o #define ifdef __cplusplus / # endif e posso simplesmente criar um arquivo C parecido com:

/* this is a simple program */

#include <stdio.h>

/* add the extern function definition */
extern "C" int __stdcall NGCD( int *a, int *b );

/* this is the main program section */
int main( int argc, char *argv[] )
{
   int a = 36;
   int b = 24;
   int c = 0;

   printf( "hi mom\n" );

   /* now call a FORTRAN function from C */
   c = NGCD( &a, &b );
   printf( "NGCD(%d,%d)=%d\n", a, b, c );

   return 0;
}

e compile-o com a lista FORTRAN acima, o aplicativo vincula, executa e gera os resultados correto

C:\fooonly>fooonly.exe
hi mom
NGCD(36,24)=12

C:\fooonly>

Quando tento repetir esse processo usando o GNU Autotools no MinGW ou OSX, continuo recebendo os seguintes erros:

macbook:makecheck $ make
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"fooonly\" -DVERSION=\"1.0.2\" -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gfortran  -g -O2   -o fooonly main.o ngcd.o  
Undefined symbols for architecture x86_64:
  "_NGCD", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [fooonly] Error 1
macbook:makecheck $ 

onde o Makefile (gerado pelo GNU Autotools) contém basicamente os seguintes comandos:

macbook:makecheck $ gcc -c main.c
macbook:makecheck $ gfortran -c ngcd.f
macbook:makecheck $ gcc -o fooonly main.c ngcd.o
Undefined symbols for architecture x86_64:
  "_NGCD", referenced from:
      _main in cc9uPBWl.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
macbook:makecheck $ 

meu script configure.in não contém mais do que:

AC_INIT(main.c)
AM_INIT_AUTOMAKE(fooonly, 1.0.2)

## C/C++ compiler section
AC_PROG_CC

## fortran section
AC_PROG_F77

## output section
AC_OUTPUT(Makefile)

que é essencialmente,

macbook:makecheck $ gcc -c main.c
macbook:makecheck $ gfortran -c ngcd.f
macbook:makecheck $ gcc -o fooonly main.c ngcd.o

certo

Estou tentando criar isso em várias plataformas (Linux, Win32 / 64, OSX etc.) e desejo usar o GNU Autotools, e sei que isso é feito com outros projetos de código aberto, mas os scripts configure.in para esses projetos estão muito além das minhas novidades do GNU Autotools e fico um pouco sobrecarregado ao tentar decodificá-lo

Acho que isso tem algo a ver com:

1) As definições que usei no script configure.in, 2) não incluo um conjunto mágico de opções (ou seja, -fno-segundo-sublinhado?) Ou 3) alguma combinação das dua

Ao fechar e, em caso afirmativo, como faço para criar o aplicativo?

questionAnswers(2)

yourAnswerToTheQuestion