#windows #makefile #cygwin #fortran #freebsd
#Windows #makefile #cygwin #fortran #freebsd
Вопрос:
У меня есть коды на C и Fortran, разработанные во FreeBSD, и я хочу запустить их в своей системе Windows. Поэтому я использую Cygwin в качестве альтернативы. Помимо кодов, есть также Makefile, и я попробовал и внес некоторые изменения в Makefile. Теперь makefile работает отлично, но в какой-то момент в makefile он выдает мне множество ошибок, связанных с библиотеками Fortran и Lapack. Я проверил свои библиотеки, и обе они присутствуют в моей системе. После обращения к соответствующим вопросам с форума я попробовал и использовал множество вариантов. Но это не сработало. И я новичок в этом материале Makefile. Пожалуйста, помогите мне разобраться с этими ошибками.
Ниже приведен Makefile
#BASE_DIR=..
STD_LIB= -lm -llapack -lblas -lgcc -lgfortran
#PROF_LIB=-lm_p -llapack_p -lblas_p -lg2c_p -L/usr/local/lib/gcc46 -lgfortran
#PROF=-pg
:if empty(PROF)
LDFLAGS=$(STD_LIB)
:else
LDFLAGS=$(PROF_LIB)
:endif
#LDFLAGS =-L $(TOOL_DIR)/trapfpe -ltrapfpe
#test::
# echo LDFLAG=$(LDFLAGS)
CC=/usr/bin/gcc
FC=/usr/bin/gfortran
CFLAGS= -g -ggdb -O3 -ffast-math -I -Wall $(PROF)
#CFLAGS= -g -ffast-math -I -Wall $(PROF)
FFLAGS= -g -I -Wall $(PROF) -fbounds-check
COMMON_OBJS=phase_unwrapping-lib.o matrix.o splotlib.o args_lib.o
UNWRAP_TOOL=rot_comp_unwrap
SUB=res_pos
ALL=$(UNWRAP_TOOL)
WORK=$(ALL)
WORK =poisson_test boundary_search clustering band_matrix
default:: ctags $(WORK)
all:: $(ALL)
ctags::tags
tags:$(WORK:C/$/.c/) $(SUB:C/$/.c/)
ctags -w $ $^
# ctags -w $ (.ALLSRC)
GA_OBJS=res_pos.o ga-core.o ga-fit.o data.o
CLUSTERING_OBJS=clustering.o
BOUNDARY_SUB_OBJS=poisson_enclosed_Neumann.o intlin.o solve_flux_eps_least_norm.o band_matrix.o
BOUNDARY_OBJS=boundary_search.o $(BOUNDARY_SUB_OBJS)
SRCS=rot_comp_unwrap.c clustering.c boundary_search.c poisson_test.c res_pos.c band_matrix.c
rot_comp_unwrap:rot_comp_unwrap.o $(GA_OBJS) $(CLUSTERING_OBJS) $(BOUNDARY_OBJS) $(COMMON_OBJS)
$(CC) $(CFLAGS) -o $@ $(LDFLAGS) $^
# $(CC) $(CFLAGS) -o $(.TARGET) $(LDFLAGS) $(.ALLSRC)
res_pos:res_pos.c ga-core.o ga-fit.o data.o
$(CC) -o $@ -DMAIN $(CFLAGS) $(LDFLAGS) $^
# $(CC) -o $(.TARGET) -DMAIN $(CFLAGS) $(LDFLAGS) $(.ALLSRC)
poisson_test:poisson_test.o poisson_enclosed_Neumann.o intlin.o
$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^
# $(CC) -o $(.TARGET) $(CFLAGS) $(LDFLAGS) $(.ALLSRC)
boundary_search:boundary_search.c $(BOUNDARY_SUB_OBJS) $(COMMON_OBJS)
$(CC) -DMAIN $(CFLAGS) -O3 -o $@ $(LDFLAGS) $^
# $(CC) -DMAIN $(CFLAGS) -O3 -o $(.TARGET) $(LDFLAGS) $(.ALLSRC)
band_matrix:band_matrix.c $(COMMON_OBJS)
$(CC) -DMAIN $(CFLAGS) -ffast-math -o $@ $(LDFLAGS) $^
# $(CC) -DMAIN $(CFLAGS) -ffast-math -o $(.TARGET) $(LDFLAGS) $(.ALLSRC)
clustering:clustering.c $(COMMON_OBJS)
$(CC) -DMAIN $(CFLAGS) -ffast-math -o $@ $(LDFLAGS) $^
# $(CC) -DMAIN $(CFLAGS) -ffast-math -o $(.TARGET) $(LDFLAGS) $(.ALLSRC)
clean::
rm *.o
backup::
cp -pf *.c *.F *.h *.o Makefile $(WORK) bak
depend::
mkdep ${CFLAGS} ${SRCS}
Ниже приведены ошибки, которые я получаю
/usr/bin/gcc -g -ggdb -O3 -ffast-math -I -Wall -o rot_comp_unwrap rot_comp_unwrap.o res_pos.o ga-core.o ga-fit.o data.o clustering.o boundary_search.o poisson_enclosed_Neumann.o intlin.o solve_flux_eps_least_norm.o band_matrix.o phase_unwrapping-lib.o matrix.o splotlib.o args_lib.o
ga-core.o: In function `cpgene_':
/cygdrive/e/Lc-code1/ga-core.F:93: undefined reference to `_gfortran_runtime_error_at'
/cygdrive/e/Lc-code1/ga-core.F:93:(.text 0x5c): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_gfortran_runtime_error_at'
/cygdrive/e/Lc-code1/ga-core.F:113:(.text 0x459): additional relocation overflows omitted from the output
/cygdrive/e/Lc-code1/ga-core.F:116: undefined reference to `_gfortran_transfer_real_write'
/cygdrive/e/Lc-code1/ga-core.F:116: undefined reference to `_gfortran_st_write_done'
ga-core.o: In function `fluct_':
/cygdrive/e/Lc-code1/ga-core.F:274: undefined reference to `_gfortran_rand'
ga-core.o:/cygdrive/e/Lc-code1/ga-core.F:278: more undefined references to `_gfortran_runtime_error_at' follow
ga-fit.o: In function `gapara_':
/cygdrive/e/Lc-code1/ga-fit.F:241: undefined reference to `_gfortran_st_open'
/cygdrive/e/Lc-code1/ga-fit.F:243: undefined reference to `_gfortran_st_read'
/cygdrive/e/Lc-code1/ga-fit.F:243: undefined reference to `_gfortran_transfer_integer'
/cygdrive/e/Lc-code1/ga-fit.F:243: undefined reference to `_gfortran_st_read_done'
/cygdrive/e/Lc-code1/ga-fit.F:244: undefined reference to `_gfortran_st_read'
/cygdrive/e/Lc-code1/solve_flux_eps_least_norm.F:73: undefined reference to `dgesv_'
/cygdrive/e/Lc-code1/solve_flux_eps_least_norm.F:109: undefined reference to `dgbsv_'
collect2: error: ld returned 1 exit status
Makefile:47: recipe for target 'rot_comp_unwrap' failed
make: *** [rot_comp_unwrap] Error 1
Ответ №1:
Вы удалили все внешние библиотеки из ваших флагов компоновщика. Добавьте библиотеки из STD_LIB в вашу команду
Комментарии:
1. Не могли бы вы, пожалуйста, уточнить свой ответ, что делать.
2. раскомментируйте строку LDFLAGS=$(STD_LIB)
3. Я сделал это, но снова те же ошибки. Есть ли какая-либо разница между файлами .f и .F с расширением fortran. Поскольку все мои файлы fortran с . Расширение F.
4. Вы можете попробовать использовать gfortran для компиляции и связывания файлов fortran, используя $(FC) вместо CC .
5. Я изменил $ (FC) вместо $ (CC), поэтому ошибки, связанные с библиотеками fortran, исчезли, и остались только ошибки, связанные с Lapack.