This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Undefined symbols for deferred bindings
- From: "Rouson, Damian" <rouson at sandia dot gov>
- To: gfortran <fortran at gcc dot gnu dot org>
- Date: Mon, 9 Nov 2009 08:11:43 -0700
- Subject: Undefined symbols for deferred bindings
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