2015-12-10 3 views
0

У меня есть программа записи на 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 
+3

Давайте начнем с отступом, команды для правила должны быть отступом одной вкладки. Когда вы исправили это, вернитесь и обновите вопрос, включив в него фактическую проблему с make-файлом. Например, скажите нам, что вы пытаетесь использовать. Включите весь вывод, полный и неотредактированный. –

+0

У вас есть фрагмент файла makefile здесь, который использует большое количество переменных, которые не определены нигде, где мы можем видеть.Вы должны показать нам полный пример и, как указал Йоахим, команды, которые вы используете, и точный результат/результаты, которые вы получаете. –

+0

Я редактировал свой пост. – Gatto

ответ

1

Я хотел бы предложить вам использовать automakeautoconf). Он имеет большое количество metatag с, но для простых программ его быстрее писать, и в большинстве случаев вы можете столкнуться с минимальными изменениями (например, filename).

Вот мой autoconf и automake «s вход для аналогичного проекта, который просто использует lapack, вместо mkl.

configure.ac

#AC_PREREQ(2.69) 
AC_INIT([src], [0.1], 
    [], 
    [mftc], 
    []) 
AC_CONFIG_AUX_DIR([build-aux]) 
AC_CONFIG_HEADERS([config.h]) 
AC_CONFIG_MACRO_DIR([m4]) 

AM_INIT_AUTOMAKE([1.9.6 dist-bzip2 subdir-objects foreign]) 

AC_SEARCH_LIBS([dsyev_], [lapack], ,AC_MSG_ERROR([No LAPACK library])) 
AC_OPENMP 
FCFLAGS="$OPENMP_FFLAGS " 
AC_PROG_FC([gfortran, ifort]) 
AC_CHECK_PROG([DEPF90_CHECK],[makedepf90],[yes],[no]) 
AM_CONDITIONAL([FOUND_MAKEDEPF90], [test "x$DEPF90_CHECK" = xyes]) 
AC_CONFIG_FILES([ 
     Makefile 
     ]) 
AC_OUTPUT 

Makefile.am

bin_PROGRAMS = mftc 
mftc_SOURCES = src/mftc.f90 src/parse.f90 src/sort.f90 
depend depend.mk: 
    makedepf90 $(mftc_SOURCES) >depend.mk 
@[email protected] @[email protected]@[email protected] 
mftc_LDADD = 
EXTRA_DIST=depend.mk autogen.sh Makefile.am 
CLEANFILES =*.mod *.log 

depend depend.mk зависит от makedepf90 программы, которая доступна на большинстве Linux платформы. Эта программа заботится о зависимостях (то есть модули скомпилированы перед программой).

Использование Если у вас все в порядке с LAPACK, я ничего не вижу для вас в файле configure.ac. Измените строку _SOURCES для правильного имени файла. Теперь его 3 команды в терминале:

$autoconf 
$./configure 
$make 

Конечно же, вы также должны иметь Automake и Autoconf установлены.

Надежда, это помогает

Смежные вопросы