I am attempting to compile and link a Fortran code calling c subroutine:
Fortran code:
program adder
integer a,b
a=1
b=2
call addnums(a,b)
stop
end program
C code:
void addnums( int* a, int* b )
{
int c = (*a) + (*b); /* convert pointers to values, then add them */
printf("sum of %i and %i is %i\n", (*a), (*b), c );
}
I used the following commands to compile and link in windows environment.
ifort -c adder.f
cl -c addnums.c
ifort -o add adder.obj addnums.obj
I get the following error:
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
-out:add.exe
-subsystem:console
adder.obj
addnums.obj
adder.obj : error LNK2019: unresolved external symbol ADDNUMS referenced in function MAIN__
add.exe : fatal error LNK1120: 1 unresolved externals
Please help me resolve this issue? Thanks.
You need to provide an interface body for the C function inside the specification part of the Fortran main program that tells the Fortran compiler that the name addnums
is a C function. Something like:
INTERFACE
SUBROUTINE addnums(a, b) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT
IMPLICIT NONE
INTEGER(C_INT) :: a, b
END SUBROUTINE addnums
END INTERFACE
(With those compilers on that platform without special options the default kind of integer is the same as C_INT - but being explicit about the integer KIND helps protect you if compiler/platform or compile options change.)
Here's two things I can see right off the bat (I work mainly with FORTRAN77 so this may not be the newest or best way to do this):
Since your C function is, well, a function (and not a subroutine), you'll need to declare 'addnums' as EXTERNAL. Add this to your code in your declarations section.
EXTERNAL addnums
Add an underscore to the name of the function in your C code. FORTRAN does this automatically to its own functions, but not to functions in other languages. So, the function's signature would be
void addnums_( int* a, int* b )
This page has a pretty good rundown on mixing C and FORTRAN. Hope this helped!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With