Hi!
FIrst of all, I've been posting and asking about this all day
today, and looking for a mailing list, without actually noticing there
was one in mailbase mentioned in the first paragraph of the fortran
90/95 news... brrrrr brrrr. I also hope this question isn't off-topic,
since it's probably more a gcc question than a ftn90 question :-)
My apologies if you get this question twice (I also posted in
comp.lang.fortran).
Anyway, I have some code (several modules) written with Lahey
lf95 express for Linux. They all compile fine (loads of assembler
warnings, but the code is OK), and produce the right results. I now want
to have a GUI for this software and started coding it in C to make use
of GTK+. As it is, I want to make use of the fortran code. Basically,
the interfacing should be straightforward, as I just pass a struct to
the fortran function that does everything. This is the first bit that
puzzled me, but more on that later.
I read Lahey's manual on mixed language programming. It all
looks clear: you can call the subroutines within a module with the
syntax
modulename@subroutinename_(parameter list)
So I compiled my module without linking with
$ lf95 -c modulename.f90 @imsllf95.cmd
(I link against the IMSL libraries as well, so they need to be included
here), which produces the modulename.o file as expected. I then wrote
a simple test program to call that function in C:
extern void modulename@subroutinename_(struct thing *);
void MAIN__(void)
{
modulename@subroutinename_(my_variable);
}
This is then compiled with gcc 2.95.2:
$ gcc -c -Wall -o f95wrap.o f95wrap.c
/tmp/ccKcRmel.s: Assembler messages:
/tmp/ccKcRmel.s:22: Error: bad reloc specifier in expression
/tmp/ccKcRmel.s:22: Error: ignoring junk `subroutinename_' after
expression
So, gcc (in fact, as) dosn't understand the "@" as part of the
function name. Now, I defined the subroutine name simply as
subroutinename_():
gcc -c -Wall -o f95wrap.o f95wrap.c
Hooray! This compiles without a single warning. Let's now
compile the f90 and C together with lf95...
$ lf95 -o prog SAR.o f95wrap.o @imsllf95.cmd
/usr/bin/lf95: sourcedir/y/bin/lf95: No such file or directory
/usr/local/lf9555/bin/../lib/libfj9i6.so: the use of `tempnam' is
dangerous, better use `mkstemp'
f95wrap.o: In function `MAIN__':
f95wrap.o(.text+0x1c): undefined reference to `process_sar_data_'
The first few lines are normal, and seem to be there
irrespective of any program that I compile. Usually, loads of warnings
are issued for the assembly, but it looks as if it works :). The problem
here is that it doesn't recognize the process_sar_data_ subroutine. I
then decided to look into the symbols in the object file, using nm
(nm (1) - list symbols from object files.). The output of this command
is quite exhaustive, but of interest (I think):
$nm SAR.o
[...]
00002c8 R .jwe_ssn_sar_processing.process_sar_data_
[...]
00004210 T sar_processing.process_sar_data_
[...]
So it looks as if the references have a dot (.) and not an
"@"!!!! Back to the C program, change the @ for the dot, and it won't
even compile (parse error):
$ gcc -c -Wall -o f95wrap.o f95wrap.c
f95wrap.c:15: parse error before `.'
f95wrap.c: In function `MAIN__':
f95wrap.c:20: `sar_processing' undeclared (first use in this function)
f95wrap.c:20: (Each undeclared identifier is reported only once
f95wrap.c:20: for each function it appears in.)
So this is where I struggle at the moment. I can easily call
subroutines that aren't inside a module (just the underscore is needed),
but as soon as they're in a module, no hope. I have also tried to get
rid of the modules, but that would be equivalent to starting from
scratch...
Can anyone shed any light on this? I am at a complete loss.
Thank you,
José
--
José L Gómez Dans PhD student
Radar & Communications Group
Department of Electronic Engineering
University of Sheffield UK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|