na56:~/experiment/fmod/gfortran>cat testmod.nm 00000004 C x_ na56:~/experiment/fmod/gfortran>cat usemod.nm 00000000 T MAIN__ U __stack_chk_fail U _gfortran_set_std U _gfortran_st_write U _gfortran_st_write_done U _gfortran_transfer_character U _gfortran_transfer_integer U compute_ 00000004 C x_ na56:~/experiment/fmod/gfortran>cat compute.nm U __stack_chk_fail U _gfortran_st_write U _gfortran_st_write_done U _gfortran_transfer_character 00000000 T compute_ 00000004 C x_ [testmod.f90] MODULE TESTMOD IMPLICIT NONE INTEGER :: X COMMON /X/ X INTERFACE SUBROUTINE COMPUTE(X) INTEGER X END SUBROUTINE END INTERFACE END MODULE TESTMOD [usemod.f90] PROGRAM USEMOD USE TESTMOD IMPLICIT NONE !INTEGER X ! This will shadow the global X !CALL COMPUTE(1D0) ! This does not work (compile error) X=0 WRITE(*,*) 'X is now:',X WRITE(*,*) 'Calling "compute"' CALL COMPUTE(1) WRITE(*,*) 'X is now:',X END PROGRAM USEMOD [compute.f90] SUBROUTINE COMPUTE(Y) USE TESTMOD IMPLICIT NONE INTEGER Y !INTEGER X ! this will shadow the X from usemod !COMMON /X/ X WRITE(*,*) 'Inside the compute routine (increasing X by 1)' X=X+1 END SUBROUTINE COMPUTE [Makefile] .SUFFIXES: .f90 .o .mod .PHONY: clean objdump FC=gfortran FCOPTS=-c ALL=usemod MODFILES=testmod.mod OBJFILES=testmod.o compute.o usemod.o usemod: $(MODFILES) $(OBJFILES) $(FC) -o $@ $(OBJFILES) .f90.o: $(FC) $(FCOPTS) $< # .mod files are actually generated as a "bi-product" .f90.mod: $(FC) $(FCOPTS) $< # Disable default build rule for .mod files. %.o : %.mod clean: rm -f $(OBJFILES) $(MODFILES) $(ALL)