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?