У меня есть программа записи на fortran, которая использует библиотеку. Для компиляции я использую мой простой скрипт, и все прекрасно:Проблемы с файлом gfortran
gfortran -c mod_input.f90 mod_cpp.f90 mod_data.f90 main.f90 b_coils.f
gfortran - о главной mod_input.o mod_cpp.o mod_data.o main.o b_coils.o libspline.a -lstdC++
(libspline.a - библиотека писать на C++)
Теперь я хочу использовать make-файл вместо сценария оболочки, но не знаю, как его правильно записать.
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 [email protected] ===
$(FORT) $(FORTFLAGS) $(LDFLAGS) $(LIBDIR) -o [email protected] $(LIBS) $^
#compilation target
compile :$(addprefix $(objdir),$(objects))
# compilation rules
$(objdir)%.o : $(srcdir)%.f90
@echo === compile $< ===
$(FORT) -c $(objdir) $(FORTFLAGS) -o [email protected] $<
$(objdir)%.o : $(srcdir)%.f
@echo === compile $< ===
$(FORT) -c $(objdir) $(FORTFLAGS) -o [email protected] $<
# 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
Давайте начнем с отступом, команды для правила должны быть отступом одной вкладки. Когда вы исправили это, вернитесь и обновите вопрос, включив в него фактическую проблему с make-файлом. Например, скажите нам, что вы пытаетесь использовать. Включите весь вывод, полный и неотредактированный. –
У вас есть фрагмент файла makefile здесь, который использует большое количество переменных, которые не определены нигде, где мы можем видеть.Вы должны показать нам полный пример и, как указал Йоахим, команды, которые вы используете, и точный результат/результаты, которые вы получаете. –
Я редактировал свой пост. – Gatto