moduleを使ったサンプルとMakefile

Fortran90でmoduleを使ってみました。Makefileもあります。
注意としては、最後に実行ファイルをコンパイルする際に、モジュールのオブジェクトファイル.oも一緒にリンクしないといけないという事です。そうしないと、

undefined reference to `matrix_mp_print_matrix_'

のようなエラーがでます。

main.f90

program main

  use matrix
  implicit none


  real(kind=8), allocatable, dimension(:,:):: a
  integer(kind=8), parameter :: d = 5 

  allocate(a(d,d))

  a(:,:) = 0.1d0

  call print_matrix(a)

  call set_matrix(a)
  call print_matrix(a)

  call set_matrix(a)
  call print_matrix(a)

  deallocate(a)

end program main

matrix.f90

module matrix
  implicit none

  integer(kind=8), private :: iarg = 1
  public set_matrix, print_matrix

  contains

  subroutine set_matrix(rarg)
    implicit none

    real(kind=8), intent(inout), dimension(:,:) :: rarg

    integer(kind=8) :: d1, d2
    integer(kind=8) :: n, m

    d1 = size(rarg, 1)
    d2 = size(rarg, 2)

    do n=1, d1
      do m=1, d2
        rarg(n, m) = (m*n+1)*rarg(n,m)
      enddo
    enddo

  end subroutine set_matrix
  
  subroutine print_matrix(rarg)
    implicit none
    real(kind=8), intent(in), dimension(:,:) :: rarg
    integer(kind=8) :: d1, d2
    integer(kind=8) :: n, m

    d1 = size(rarg, 1)
    d2 = size(rarg, 2)

    write(*, fmt='(a)') "matrix = "
    do n=1, d1
      do m=1, d2
        write(*, fmt='(f10.5)', advance='no') rarg(n, m)
      enddo
      write(*, *)
    enddo
    write(*, fmt='(a, i5)') "factor  = ", iarg
    write(*, *)
  end subroutine print_matrix

end module matrix

Makefile

FC=ifort
FCFLAGS=-O3

TRG=main
OBJS=matrix.o
MODULES=matrix.mod

all: $(MODULES) main

main: main.o $(OBJS)
	$(FC) $(FCFLAGS) -o $@ $^
	./$@

clean:
	$(RM) -f $(TRG)
	$(RM) -f *.o *.mod

.SUFFIXES: .mod .f90 .o
.f90.mod:
	$(FC) $(FCFLAGS) -c $<
.f90.o:
	$(FC) $(FCFLAGS) -c -o $@ $<

Makefileは、拡張子mod用にSUFFIXSを指定してあげる必要があります。