Undefined symbols for deferred bindings
Rouson, Damian
rouson@sandia.gov
Wed Nov 11 09:06:00 GMT 2009
The code below compiles correctly (hooray!), but the linker can't find the
symbols related to the deferred bindings. It's possible there's a problem
in my link line, so you might jump straight to the bottom. Otherwise, foo
defines an abstract type (as in my previous posting); bar extends foo and
overrides foo's deferred bindings; and main declares a bar object and passes
it to the "rescale" procedure inside foo_module.
Damian
$ cat foo.f90
module foo_module
implicit none
private
public :: foo,rescale
type ,abstract :: foo
contains
procedure(times_interface) ,deferred :: times
procedure(assign_interface) ,deferred :: assign
generic :: operator(*) => times
generic :: assignment(=) => assign
end type
abstract interface
function times_interface(this,factor) result(product)
import :: foo
class(foo) ,intent(in) :: this
class(foo) ,allocatable :: product
real, intent(in) :: factor
end function
subroutine assign_interface(lhs,rhs)
import :: foo
class(foo) ,intent(inout) :: lhs
class(foo) ,intent(in) :: rhs
end subroutine
end interface
contains
subroutine rescale(this,scale)
class(foo) ,intent(inout) :: this
real, intent(in) :: scale
this = this*scale
end subroutine
end module
$
$ cat bar.f90
module bar_module
use foo_module ,only : foo
implicit none
private
public :: bar
type ,extends(foo) :: bar
private
real :: x=1.
contains
procedure :: times => times_bar
procedure :: assign => assign_bar
end type
contains
subroutine assign_bar(lhs,rhs)
class(bar) ,intent(inout) :: lhs
class(foo) ,intent(in) :: rhs
select type(rhs)
type is (bar)
lhs%x = rhs%x
end select
end subroutine
function times_bar(this,factor) result(product)
class(bar) ,intent(in) :: this
real, intent(in) :: factor
class(foo), allocatable :: product
select type(this)
type is (bar)
allocate(product,source=this)
select type(product)
type is(bar)
product%x = this%x*factor
end select
end select
end function
end module
$
$ cat main.f90
program main
use foo_module ,only : foo,rescale
use bar_module ,only : bar
implicit none
type(bar) :: unit
call rescale(unit,3.141592654)
end program
$
$ make
gfortran -c foo.f90
gfortran -c bar.f90
gfortran -c main.f90
gfortran main.o foo.o bar.o -o foobar
Undefined symbols:
"_assign_interface_", referenced from:
___foo_module_MOD_rescale in foo.o
"_times_interface_", referenced from:
___foo_module_MOD_rescale in foo.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [foobar] Error 1
More information about the Fortran
mailing list