Compilation de program : linkage de fonctions impossible
Je travail sur un code en recherche ce qui signifie que beaucoup de choses (liens vers librairies, etc...) sont sont définis "à la main" et peuvent facilement casser quand on change de système.
J'ai du changer de machine et par conséquent le code ne compile plus.
J'ai déjà résolu plusieurs problèmes de librairies à recompiler et placer aux bons emplacements, etc... Cependant j'arrive à ma limite de capacités sur ce problème. :?:oops:
En compilant avec gfortran sous Ubuntu dans une machine virtuelle, voici ce que j'obtiens comme log:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| user@computer:~/Documents/program_name/src$ make gfortran=yes debug=yes
gfortran -cpp -g -fbounds-check -fimplicit-none -o program_name modules.o mem.o utils.o FIM.o input.o output.o benchmarks.o read_param.o io_prodimo.o init_program_name.o scattering.o dust_ray_tracing.o dust.o molecules.o grid.o optical_depth.o stars.o density.o PAH.o diffusion.o observables.o thermal_emission.o dust_transfer.o mol_transfer.o program_name.o -L/home/user/Documents/program_name/lib/gfortran/lib/ -lappel_syst -L/home/user/Documents/program_name/lib/gfortran/lib/nr/eq_diff -lnr_eq_diff -L/home/user/Documents/program_name/lib/gfortran/lib/nr/spline -lnr_splin -L/home/user/Documents/program_name/lib/gfortran/lib/nr/sort -lnr_sort -L/home/user/Documents/program_name/lib/gfortran/lib/nr -lnr -L/home/user/Documents/program_name/lib/gfortran/lib/ -lsprng -L/home/user/Documents/program_name/lib/gfortran/lib/ -lcfitsio -I/home/user/Documents/program_name/lib/gfortran/include
mem.o*: Dans la fonction «*__mem_MOD_restore_checkpoint*»*:
/home/user/Documents/program_name/src/mem.f90:1899*: référence indéfinie vers «*funpack_rng_*»
mem.o*: Dans la fonction «*__mem_MOD_save_checkpoint*»*:
/home/user/Documents/program_name/src/mem.f90:1802*: référence indéfinie vers «*fpack_rng_*»
utils.o*: Dans la fonction «*__utils_MOD_gauss_random*»*:
/home/user/Documents/program_name/src/utils.f90:100*: référence indéfinie vers «*fget_rn_dbl_*»
/home/user/Documents/program_name/src/utils.f90:101*: référence indéfinie vers «*fget_rn_dbl_*»
stars.o*: Dans la fonction «*__stars_MOD_emit_packet_ism*»*:
/home/user/Documents/program_name/src/stars.f90:862*: référence indéfinie vers «*fget_rn_dbl_*»
/home/user/Documents/program_name/src/stars.f90:863*: référence indéfinie vers «*fget_rn_dbl_*»
/home/user/Documents/program_name/src/stars.f90:873*: référence indéfinie vers «*fget_rn_dbl_*»
stars.o:/home/user/Documents/program_name/src/stars.f90:874*: encore plus de références indéfinies suivent vers «*fget_rn_dbl_*»
dust_transfer.o*: Dans la fonction «*__dust_transfer_MOD_transfert_poussiere*»*:
/home/user/Documents/program_name/src/dust_transfer.f90:141*: référence indéfinie vers «*finit_rng_*»
/home/user/Documents/program_name/src/dust_transfer.f90:558*: référence indéfinie vers «*fget_rn_dbl_*»
mol_transfer.o*: Dans la fonction «*__mol_transfer_MOD_nlte_mol_line_transfer*»*:
/home/user/Documents/program_name/src/mol_transfer.f90:307*: référence indéfinie vers «*finit_rng_*»
/home/user/Documents/program_name/src/mol_transfer.f90:372*: référence indéfinie vers «*fget_rn_dbl_*»
/home/user/Documents/program_name/src/mol_transfer.f90:373*: référence indéfinie vers «*fget_rn_dbl_*»
/home/user/Documents/program_name/src/mol_transfer.f90:374*: référence indéfinie vers «*fget_rn_dbl_*»
/home/user/Documents/program_name/src/mol_transfer.f90:378*: référence indéfinie vers «*fget_rn_dbl_*»
/home/user/Documents/program_name/src/mol_transfer.f90:382*: référence indéfinie vers «*fget_rn_dbl_*»
mol_transfer.o:/home/user/Documents/program_name/src/mol_transfer.f90:392*: encore plus de références indéfinies suivent vers «*fget_rn_dbl_*»
collect2: error: ld returned 1 exit status
Makefile:96: recipe for target 'program_name' failed
make: *** [program_name] Error 1 |
Etrangement les noms des fonctions sont changés: un "f" est rajouté au début de leur nom. La fonction "init_rng" devient "finit_rng_" et du coup ne peut pas être linké correctement. J'ai l'impression que cela doit provenir des options de compilations utilisées dans le makefile. Voici les lignes du makefile qui set ces options:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| FC_SER = gfortran -cpp
FC_OMP = gfortran -cpp -fopenmp
OPTS = -O3 -ffast-math #-mtune=athlon -mcpu=athlon -mfpmath=sse -msse
DEBUG_OPTS = -g -fbounds-check -ftrace=full -fimplicit-none #-g -C -ggdb -ftrace=full
# -Wall -Wextra -Wimplicit-none -Werror=113,115,137,146,147,159,163 -ftrace=full -fbounds-check -freal=nan -finteger=-2109876543 -fmodule-private
#PARALLEL = -openmp
MACH = #-march=athlon
PREC =
FFLAGS = -c $(PREC)
FFLAGS_EXE = $(PREC)
LIBS = $(program_name_INSTALL)/lib/gfortran/
LIBS_PGPLOT = -L$(LIBS) -lpgplot
LIBS_FITS = -L$(LIBS) -lcfitsio
LIBS_SYST = -L$(LIBS) -lappel_syst
# Numerical Recipes
MODS_NR = -I$(LIBS)/nr
LIBS_NR = -L$(LIBS)/nr -lnr
LIBS_NR_EQDIFF = -L$(LIBS)/nr/eq_diff -lnr_eq_diff
LIBS_SPLINE = -L$(LIBS)/nr/spline -lnr_splin
LIBS_SORT = -L$(LIBS)/nr/sort -lnr_sort
LIBS_LU = -L $(LIBS)/nr/LU -lnr_LU
# SPRNG
FLAGS_SPRNG = $(FLAGS)
INCLUDE_SPRNG = -I$(program_name_INSTALL)/include
LIBS_SPRNG = -L$(LIBS) -lsprng
FF = $(FC_OMP) $(MACH) $(OPTS)
FF = $(FC_SER) $(DEBUG_OPTS)
SOURCES = modules.f90 sha.f90 utils.f90 mem.f90 FIM.f90 input.f90 output.f90\
benchmarks.f90 read_param.f90 io_prodimo.f90 init_program_name.f90 \
scattering.f90 coated_sphere.f90 dust_ray_tracing.f90 dust.f90 \
molecules.f90 grid.f90 optical_depth.f90 \
stars.f90 density.f90 PAH.f90 diffusion.f90 observables.f90 \
thermal_emission.f90 dust_transfer.f90\
mol_transfer.f90 \
program_name.f90
OBJECTS = $(SOURCES:.f90=.o)
main : program_name
program_name : $(OBJECTS)
$(FF) $(FFLAGS_EXE) -o program_name $(OBJECTS) $(COMP_FITS) $(LIBS_SYST) $(LIBS_NR_EQDIFF) $(LIBS_SPLINE) $(LIBS_SORT) $(LIBS_NR) $(LIBS_SPRNG) $(LIBS_FITS) $(INCLUDE_SPRNG)
# Fichiers necessaires aux suivants
modules.o : modules.f90
$(FF) $(FFLAGS) $(FLAGS_SPRNG) modules.f90 $(INCLUDE_SPRNG) $(COMP_FITS)
# Fichier compile sans optimisation
mem.o : mem.f90 modules.o
$(FF) $(FFLAGS) $(FLAGS_SPRNG) mem.f90 $(INCLUDE_SPRNG) $(COMP_FITS)
# defaut
%.o : %.f90 modules.o
$(FF) $(FFLAGS) $(FLAGS_SPRNG) $< -o $@ $(MODS_NR) $(INCLUDE_SPRNG) $(COMP_FITS) |
Quel est le problème? pourquoi lors de la compilations les fonctions sont renommées? Quel option de compilation pose problème? Ou bien est- autre chose?