ฉันมีโปรแกรมเขียนบน Fortran ซึ่งใช้ไลบรารี่ สำหรับการคอมไพล์ ฉันใช้เชลล์สคริปต์อย่างง่าย และทุกอย่างเรียบร้อยดี:
gfortran -c mod_input.f90 mod_cpp.f90 mod_data.f90 main.f90 b_coils.f
gfortran -o หลัก mod_input.o mod_cpp.o mod_data.o main.o b_coils.o libspline.a -lstdc++
(libspline.a - การเขียนไลบรารีบน c++)
ตอนนี้ฉันต้องการใช้ 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
ผลลัพธ์:
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
$^
ของคุณก่อน$(LIBS)
แล้วหรือยัง? ลำดับมีความสำคัญเมื่อทำการเชื่อมโยง ดังนั้นจึงอาจเป็นเรื่องง่ายๆ เช่นนั้น - person jefflarkin   schedule 10.12.2015