I have program writing on fortran which uses library. For compiling I use my simple shell script and everything is fine:
gfortran -c mod_input.f90 mod_cpp.f90 mod_data.f90 main.f90 b_coils.f
gfortran -o main mod_input.o mod_cpp.o mod_data.o main.o b_coils.o libspline.a -lstdc++
(libspline.a - library writing on c++)
Now I want to use makefile instead of shell script, but don't know how to write it properly.
Makefile:
target = main srcdir = src/ objdir = obj/ targetdir = run/ FORT = gfortran mflag = module FORTFLAGS = LDFLAGS = -lstdc++ MKLPATH =/home/gatto/Desktop/ray_u3/src LIBDIR =-L$(MKLPATH) LIBS = -lspline MODDIR = obj/ # Ray sources sources = mod_input.f90 mod_cpp.f90 mod_data.f90 main.f90 b_coils.f # objects objects = $(patsubst %.for,%.o,$(filter %for,$(sources)) ) objects += $(patsubst %.f90,%.o,$(filter %f90,$(sources)) ) # main target build:$(targetdir)$(target) # build rules $(targetdir)$(target):$(addprefix $(objdir),$(objects)) @echo === build $@ === $(FORT) $(FORTFLAGS) $(LDFLAGS) $(LIBDIR) -o $@ $(LIBS) $^ #compilation target compile :$(addprefix $(objdir),$(objects)) # compilation rules $(objdir)%.o : $(srcdir)%.f90 @echo === compile $< === $(FORT) -c $(objdir) $(FORTFLAGS) -o $@ $< $(objdir)%.o : $(srcdir)%.f @echo === compile $< === $(FORT) -c $(objdir) $(FORTFLAGS) -o $@ $< # cleaning rules cleanobj: -rm $(objdir)*.o $(objdir)*.mod cleantarget: -rm $(targetdir)$(target) cleanall:cleanobj cleantarget .PHONY: compile build cleanall cleanobj cleantarget Output:
gfortran -lstdc++ -L/home/gatto/Desktop/ray_u3/src -o run/main -lspline obj/mod_input.o obj/mod_cpp.o obj/mod_data.o obj/main.o obj/mod_data.o: In function `__global_data_MOD_modbfield': mod_data.f90:(.text+0x3e2): undefined reference to `gbcoil_' obj/mod_data.o: In function `__global_data_MOD_moddensity': mod_data.f90:(.text+0x5d4): undefined reference to `GetSplineValue' mod_data.f90:(.text+0x64f): undefined reference to `GetSplineValue' mod_data.f90:(.text+0x6ca): undefined reference to `GetSplineValue' mod_data.f90:(.text+0x745): undefined reference to `GetSplineValue' obj/mod_data.o: In function `__global_data_MOD_inpfile': mod_data.f90:(.text+0xa66): undefined reference to `Approx_input' mod_data.f90:(.text+0xa75): undefined reference to `SetSpline' collect2: error: ld returned 1 exit status make: *** [run/main] Error 1
$^before the$(LIBS)? Order matters when linking, so it may be as simple as that.