Фортран неопределенная ссылка на

Я пытаюсь скомпилировать код на Фортране, предоставленный мне коллегой по лаборатории, для проведения некоторых анализов. Программа включает вызов сценариев MATLAB для расчета определенных вещей. Файлы, которые он мне дал, были настроены для работы на другом компьютере, и я пытаюсь заставить их работать на моем. Я изменил пути к библиотекам ACML и MATLAB на соответствующие на моем компьютере.

Ошибка, которую я получаю:

gfortran -v   -O2 -Wl,-rpath-link,/usr/local/MATLAB/R2012a/bin/glnxa64 -L/opt/acml4.3.0/gfortran64/lib -lacml -lacml_mv -lgfortran -L/usr/local/MATLAB/R2012a/bin/glnxa64 -leng -lmx obj/gctad.mod.o obj/glrkn_functions.mod.o obj/glrkn.mod.o obj/tfe.mod.o obj/glrkn_ext.mod.o obj/tfe_readfile.mod.o obj/glrkn_readfile.mod.o obj/matlab.mod.o obj/partitions.mod.o obj/glrkn_preproc.o obj/glrkn_thrml_props.o obj/glrkn_init_logs.o obj/glrkn_press_init.o obj/glrkn_press_updt.o obj/glrkn_tmpr_init.o obj/glrkn_tmpr_updt.o obj/glrkn_ext_press_init.o obj/glrkn_ext_press_updt.o obj/glrkn_ext_tmpr_init.o obj/glrkn_ext_tmpr_updt.o obj/glrkn_dynamic.o obj/glrkn_el_log.o obj/glrkn_rk4.o obj/glrkn_nwmrk.o obj/glrkn_init_accel.o obj/sorti.o obj/tfe_preproc.o obj/tfe_reorder.o obj/tfe_mtxmk.o obj/tfe_ext_out_init.o obj/tfe_ext_flx_init.o obj/tfe_ext_out_updt.o obj/tfe_ext_flx_updt.o obj/tfe_flx_init.o obj/tfe_flx_updt.o obj/tfe_dynamic.o obj/tfe_tmpr_rate_init.o obj/panel_main.o -o main.out 
Driving: gfortran -v -O2 -Wl,-rpath-link,/usr/local/MATLAB/R2012a/bin/glnxa64 -L/opt/acml4.3.0/gfortran64/lib -lacml -lacml_mv -l gfortran -l m -L/usr/local/MATLAB/R2012a/bin/glnxa64 -leng -lmx obj/gctad.mod.o obj/glrkn_functions.mod.o obj/glrkn.mod.o obj/tfe.mod.o obj/glrkn_ext.mod.o obj/tfe_readfile.mod.o obj/glrkn_readfile.mod.o obj/matlab.mod.o obj/partitions.mod.o obj/glrkn_preproc.o obj/glrkn_thrml_props.o obj/glrkn_init_logs.o obj/glrkn_press_init.o obj/glrkn_press_updt.o obj/glrkn_tmpr_init.o obj/glrkn_tmpr_updt.o obj/glrkn_ext_press_init.o obj/glrkn_ext_press_updt.o obj/glrkn_ext_tmpr_init.o obj/glrkn_ext_tmpr_updt.o obj/glrkn_dynamic.o obj/glrkn_el_log.o obj/glrkn_rk4.o obj/glrkn_nwmrk.o obj/glrkn_init_accel.o obj/sorti.o obj/tfe_preproc.o obj/tfe_reorder.o obj/tfe_mtxmk.o obj/tfe_ext_out_init.o obj/tfe_ext_flx_init.o obj/tfe_ext_out_updt.o obj/tfe_ext_flx_updt.o obj/tfe_flx_init.o obj/tfe_flx_updt.o obj/tfe_dynamic.o obj/tfe_tmpr_rate_init.o obj/panel_main.o -o main.out -l gfortran -l m -shared-libgcc
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 
Reading specs from /usr/lib/gcc/x86_64-linux-gnu/4.6/libgfortran.spec
rename spec lib to liborig
COLLECT_GCC_OPTIONS='-v' '-O2' '-L/opt/acml4.3.0/gfortran64/lib' '-L/usr/local/MATLAB/R2012a/bin/glnxa64' '-o' 'main.out' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-O2' '-L/opt/acml4.3.0/gfortran64/lib' '-L/usr/local/MATLAB/R2012a/bin/glnxa64' '-o' 'main.out' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o main.out /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/opt/acml4.3.0/gfortran64/lib -L/usr/local/MATLAB/R2012a/bin/glnxa64 -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. -rpath-link /usr/local/MATLAB/R2012a/bin/glnxa64 -lacml -lacml_mv -lgfortran -lm -leng -lmx obj/gctad.mod.o obj/glrkn_functions.mod.o obj/glrkn.mod.o obj/tfe.mod.o obj/glrkn_ext.mod.o obj/tfe_readfile.mod.o obj/glrkn_readfile.mod.o obj/matlab.mod.o obj/partitions.mod.o obj/glrkn_preproc.o obj/glrkn_thrml_props.o obj/glrkn_init_logs.o obj/glrkn_press_init.o obj/glrkn_press_updt.o obj/glrkn_tmpr_init.o obj/glrkn_tmpr_updt.o obj/glrkn_ext_press_init.o obj/glrkn_ext_press_updt.o obj/glrkn_ext_tmpr_init.o obj/glrkn_ext_tmpr_updt.o obj/glrkn_dynamic.o obj/glrkn_el_log.o obj/glrkn_rk4.o obj/glrkn_nwmrk.o obj/glrkn_init_accel.o obj/sorti.o obj/tfe_preproc.o obj/tfe_reorder.o obj/tfe_mtxmk.o obj/tfe_ext_out_init.o obj/tfe_ext_flx_init.o obj/tfe_ext_out_updt.o obj/tfe_ext_flx_updt.o obj/tfe_flx_init.o obj/tfe_flx_updt.o obj/tfe_dynamic.o obj/tfe_tmpr_rate_init.o obj/panel_main.o -lgfortran -lm -lgcc_s -lgcc -lquadmath -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
obj/panel_main.o: In function `MAIN__':
panel_main.f90:(.text+0x280): undefined reference to `engopen_'
panel_main.f90:(.text+0x2a6): undefined reference to `engevalstring_'
panel_main.f90:(.text+0x419): undefined reference to `engevalstring_'
panel_main.f90:(.text+0x42e): undefined reference to `engclose_'
obj/glrkn_ext_press_init.o: In function `glrkn_ext_press_init_':
glrkn_ext_press_init.f90:(.text+0x25): undefined reference to `enggetvariable_'
glrkn_ext_press_init.f90:(.text+0x41): undefined reference to `mxgetnumberofelements_'
glrkn_ext_press_init.f90:(.text+0x54): undefined reference to `mxgetm_'
glrkn_ext_press_init.f90:(.text+0x67): undefined reference to `mxgetn_'
glrkn_ext_press_init.f90:(.text+0x92): undefined reference to `mxcreatedoublematrix_'
glrkn_ext_press_init.f90:(.text+0xb8): undefined reference to `mxcreatedoublematrix_'
glrkn_ext_press_init.f90:(.text+0xd6): undefined reference to `mxcreatedoublescalar_'
glrkn_ext_press_init.f90:(.text+0x1d8): undefined reference to `mxgetpr_'
glrkn_ext_press_init.f90:(.text+0x1fb): undefined reference to `mxcopyptrtoreal8_'
glrkn_ext_press_init.f90:(.text+0x22a): undefined reference to `enggetvariable_'
glrkn_ext_press_init.f90:(.text+0x246): undefined reference to `mxgetnumberofelements_'
glrkn_ext_press_init.f90:(.text+0x259): undefined reference to `mxgetm_'
glrkn_ext_press_init.f90:(.text+0x26c): undefined reference to `mxgetn_'
glrkn_ext_press_init.f90:(.text+0x36e): undefined reference to `mxgetpr_'
glrkn_ext_press_init.f90:(.text+0x391): undefined reference to `mxcopyptrtoreal8_'
obj/glrkn_ext_press_updt.o: In function `glrkn_ext_press_updt_':
glrkn_ext_press_updt.f90:(.text+0x563): undefined reference to `mxgetpr_'
glrkn_ext_press_updt.f90:(.text+0x587): undefined reference to `mxcopyreal8toptr_'
glrkn_ext_press_updt.f90:(.text+0x5a2): undefined reference to `engputvariable_'
glrkn_ext_press_updt.f90:(.text+0x5b7): undefined reference to `mxgetpr_'
glrkn_ext_press_updt.f90:(.text+0x5da): undefined reference to `mxcopyreal8toptr_'
glrkn_ext_press_updt.f90:(.text+0x5f5): undefined reference to `engputvariable_'
glrkn_ext_press_updt.f90:(.text+0x60a): undefined reference to `mxgetpr_'
glrkn_ext_press_updt.f90:(.text+0x62d): undefined reference to `mxcopyreal8toptr_'
glrkn_ext_press_updt.f90:(.text+0x648): undefined reference to `engputvariable_'
glrkn_ext_press_updt.f90:(.text+0x65d): undefined reference to `mxgetpr_'
glrkn_ext_press_updt.f90:(.text+0x680): undefined reference to `mxcopyreal8toptr_'
glrkn_ext_press_updt.f90:(.text+0x69b): undefined reference to `engputvariable_'
glrkn_ext_press_updt.f90:(.text+0x6ba): undefined reference to `engevalstring_'
glrkn_ext_press_updt.f90:(.text+0x6d9): undefined reference to `enggetvariable_'
glrkn_ext_press_updt.f90:(.text+0x6f5): undefined reference to `mxgetpr_'
glrkn_ext_press_updt.f90:(.text+0x718): undefined reference to `mxcopyptrtoreal8_'
glrkn_ext_press_updt.f90:(.text+0x724): undefined reference to `mxdestroyarray_'
glrkn_ext_press_updt.f90:(.text+0xc8a): undefined reference to `enggetvariable_'
glrkn_ext_press_updt.f90:(.text+0xca6): undefined reference to `mxgetpr_'
glrkn_ext_press_updt.f90:(.text+0xcc9): undefined reference to `mxcopyptrtoreal8_'
glrkn_ext_press_updt.f90:(.text+0xcd5): undefined reference to `mxdestroyarray_'
obj/tfe_ext_flx_init.o: In function `tfe_ext_flx_init_':
tfe_ext_flx_init.f90:(.text+0x1b): undefined reference to `enggetvariable_'
tfe_ext_flx_init.f90:(.text+0x37): undefined reference to `mxgetnumberofelements_'
tfe_ext_flx_init.f90:(.text+0x4a): undefined reference to `mxgetm_'
tfe_ext_flx_init.f90:(.text+0x5d): undefined reference to `mxgetn_'
tfe_ext_flx_init.f90:(.text+0x7a): undefined reference to `mxcreatedoublematrix_'
tfe_ext_flx_init.f90:(.text+0x99): undefined reference to `mxcreatedoublescalar_'
tfe_ext_flx_init.f90:(.text+0x19b): undefined reference to `mxgetpr_'
tfe_ext_flx_init.f90:(.text+0x1be): undefined reference to `mxcopyptrtoreal8_'
obj/tfe_ext_flx_updt.o: In function `tfe_ext_flx_updt_':
tfe_ext_flx_updt.f90:(.text+0x629): undefined reference to `mxgetpr_'
tfe_ext_flx_updt.f90:(.text+0x64d): undefined reference to `mxcopyreal8toptr_'
tfe_ext_flx_updt.f90:(.text+0x668): undefined reference to `engputvariable_'
tfe_ext_flx_updt.f90:(.text+0x67d): undefined reference to `mxgetpr_'
tfe_ext_flx_updt.f90:(.text+0x6a0): undefined reference to `mxcopyreal8toptr_'
tfe_ext_flx_updt.f90:(.text+0x6bb): undefined reference to `engputvariable_'
tfe_ext_flx_updt.f90:(.text+0x6d0): undefined reference to `mxgetpr_'
tfe_ext_flx_updt.f90:(.text+0x6f3): undefined reference to `mxcopyreal8toptr_'
tfe_ext_flx_updt.f90:(.text+0x70e): undefined reference to `engputvariable_'
tfe_ext_flx_updt.f90:(.text+0x723): undefined reference to `mxgetpr_'
tfe_ext_flx_updt.f90:(.text+0x746): undefined reference to `mxcopyreal8toptr_'
tfe_ext_flx_updt.f90:(.text+0x761): undefined reference to `engputvariable_'
tfe_ext_flx_updt.f90:(.text+0x780): undefined reference to `engevalstring_'
tfe_ext_flx_updt.f90:(.text+0x79f): undefined reference to `enggetvariable_'
tfe_ext_flx_updt.f90:(.text+0x7bb): undefined reference to `mxgetpr_'
tfe_ext_flx_updt.f90:(.text+0x7de): undefined reference to `mxcopyptrtoreal8_'
tfe_ext_flx_updt.f90:(.text+0x7ea): undefined reference to `mxdestroyarray_'
obj/tfe_dynamic.o: In function `tfe_dynamic_':
tfe_dynamic.f90:(.text+0x9c1): undefined reference to `dpbsv_'
obj/tfe_tmpr_rate_init.o: In function `tfe_tmpr_rate_init_':
tfe_tmpr_rate_init.f90:(.text+0x631): undefined reference to `dpbsv_'
collect2: ld returned 1 exit status
make: *** [run/panel_main.out] Error 1    

Makefile, который я использую:

# object directory
obj_dir = obj/
# source directory
src_dir = src/
# Run directory
run_dir = run/
# Library directory

# library options
OPTLB = -L/opt/acml4.3.0/gfortran64/lib -lacml -lacml_mv -lgfortran \
-L/usr/local/MATLAB/R2012a/bin/glnxa64 -leng -lmx

# Linker options
OPTLN = -Wl,-rpath-link,/usr/local/MATLAB/R2012a/bin/glnxa64
# Preprocessing options
OPTPP = -cpp -D__linux -D__x86_64__
# Include options
OPTIN = -J$(obj_dir) -I/usr/local/MATLAB/R2012a/extern/include
# Optimization options
OPTOP = -O2
# Debuggion options
OPTDB = 

# Main file
main = panel_main

# module files (in proper order!)
modf = gctad glrkn_functions \
glrkn tfe glrkn_ext \
tfe_readfile glrkn_readfile \
matlab partitions

# Module names
mod = gctad glrkn_functions \
glrkn_ext_tmpr glrkn_ext_press \
glrkn_files glrkn_chk glrkn_amp glrkn_props \
glrkn_params glrkn_sol glrkn_dyn \
tfe_chk tfe_mat tfe_coord tfe_size tfe_prop \
tfe_time tfe_sol tfe_files tfe_amp tfe_ext_flx \
tfe_flx tfe_ext_out tfe_dyn \
tfe_readfile glrkn_readfile \
matlab partitions

# tfe files
tfe = sorti tfe_preproc tfe_reorder tfe_mtxmk \
tfe_ext_out_init tfe_ext_flx_init \
tfe_ext_out_updt tfe_ext_flx_updt \
tfe_flx_init tfe_flx_updt \
tfe_dynamic tfe_tmpr_rate_init 

# glrkn files
glrkn = glrkn_preproc glrkn_thrml_props glrkn_init_logs \
glrkn_press_init glrkn_press_updt \
glrkn_tmpr_init glrkn_tmpr_updt \
glrkn_ext_press_init glrkn_ext_press_updt \
glrkn_ext_tmpr_init glrkn_ext_tmpr_updt \
glrkn_dynamic glrkn_el_log glrkn_rk4 \
glrkn_nwmrk glrkn_init_accel

# MATLAB library location
matlib_dir = /usr/local/MATLAB/R2012a/bin/glnxa64/
matinc_dir = /usr/local/MATLAB/R2012a/extern/include/
matlibs = eng mx

# Sources and objects
glrkn_src = $(addprefix $(src_dir), $(addsuffix .f90, $(glrkn)))
glrkn_obj = $(addprefix $(obj_dir), $(addsuffix .o, $(glrkn)))
tfe_src = $(addprefix $(src_dir), $(addsuffix .f90, $(tfe)))
tfe_obj = $(addprefix $(obj_dir), $(addsuffix .o, $(tfe)))
mod_src = $(addprefix $(src_dir), $(addsuffix .mod.f90, $(modf)))
mod_obj = $(addprefix $(obj_dir), $(addsuffix .mod.o, $(modf)))
mod_mod = $(addprefix $(obj_dir), $(addsuffix .mod, $(mod)))
main_src = $(addprefix $(src_dir), $(addsuffix .f90, $(main)))
main_obj = $(addprefix $(obj_dir), $(addsuffix .o, $(main)))
main_out = $(addprefix $(run_dir), $(addsuffix .out, $(main)))
lib_opt = $(addprefix -l, $(libs))

# Concatenate
all_obj = $(mod_obj) $(glrkn_obj) $(tfe_obj) $(main_obj)

# Main executable
$(main_out) : $(all_obj)
    gfortran -v  $(OPTDB) $(OPTOP) $(OPTLN) $(OPTLB) $(all_obj) -o main.out 
    mv main.out $(main_out)

#   gfortran $(debug) -J$(obj_dir) $(all_obj) -L$(lib_dir) -L$(matlib_dir) -Wl,-rpath-link,$(matlib_dir) $(lib_opt)  $(addprefix -l, $(matlibs)) -o main.out
# Main object
$(main_obj) : $(main_src) $(mod_obj)
    gfortran -v $(OPTPP) $(OPTDB) $(OPTOP) $(OPTIN) $< -c
    mv $(notdir $@) $@

# TFE objects
$(tfe_obj) : $(obj_dir)%.o : $(src_dir)%.f90 $(mod_obj)
    gfortran -v $(OPTPP) $(OPTDB) $(OPTOP) $(OPTIN) $< -c
    mv $(notdir $@) $@

# Structure objects
$(glrkn_obj) : $(obj_dir)%.o : $(src_dir)%.f90 $(mod_obj)
    gfortran -v $(OPTPP) $(OPTDB) $(OPTOP) $(OPTIN) $< -c
    mv $(notdir $@) $@

# Module objects
$(mod_obj) : $(obj_dir)%.mod.o : $(src_dir)%.mod.f90 
    gfortran -v $(OPTPP) $(OPTOP) $(OPTDB) $(OPTIN) $< -c 
    mv $(notdir $@) $@

# Clean objects folder
.PHONY : clean
clean :
    rm -f -v $(obj_dir)*

Я гуглил дерьмо из этого, и мне не повезло исправить это. Если у кого-то есть какие-либо идеи для меня, чтобы попробовать, я был бы очень признателен.

Спасибо, Зак


person Brutus    schedule 28.06.2012    source источник
comment
Все недостающие символы в нижнем регистре. Символы Matlab обычно имеют смешанный регистр. Либо ваш исходный код принимает все заглавные (или нижние) регистры, либо ваш компилятор переводит смешанный регистр в нижний регистр. Вероятно, есть флаг, который вы можете передать gfortran либо на этапе компиляции, либо на этапе компоновки, чтобы исправить это. Ах. Вот он: -fcase-preserve. Попробуйте добавить это в настройки OPTPP и перекомпилировать все.   -  person sfstewman    schedule 28.06.2012
comment
лучше опубликовать это как ответ, ИМХО   -  person Vladimir F    schedule 29.06.2012
comment
нет кости, ошибка остается той же   -  person Brutus    schedule 29.06.2012
comment
@Zach: я очень мало знаю Fortran, но разве вы не должны связываться с библиотеками MATLAB как -llibeng -llibmx (см. здесь для пример)   -  person Amro    schedule 29.06.2012


Ответы (2)


Говорил тот парень, который сделал это оригинально. Это была проблема с используемой версией gfortran. Я использовал gfortran 4.6.3. Он сказал, что использовал 4.4.5, когда в последний раз успешно использовал ее. Я установил gfortran 4.4 и скомпилировал без проблем. К следующей проблеме, с которой я сталкиваюсь!

person Brutus    schedule 29.06.2012
comment
Это правильная форма здесь, на SO, чтобы принять ваш собственный ответ, если он приемлем, как этот. - person High Performance Mark; 29.06.2012
comment
Попробуйте какую-нибудь свежую версию. Если это не работает, отправьте отчет об ошибке в GCC. - person Vladimir F; 29.06.2012

Почему бы не преобразовать фортран в матлаб? Если это может сработать, проверьте f2matlab на файлообменнике.

person Ben Barrowes    schedule 29.06.2012
comment
У меня уже есть скрипт MATLAB, который выполняет аналогичный анализ, но не такой гибкий. Идея состоит в том, что я мог бы взять этот сценарий и запустить его, чтобы получить результаты раньше, чем заниматься собственной разработкой кода, тем более, что он уже был доступен. - person Brutus; 29.06.2012