IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : août 2011
    Messages : 49
    Points : 50
    Points
    50
    Par défaut 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.

    En compilant avec gfortran sous Ubuntu dans une machine virtuelle, voici ce que j'obtiens comme log:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : août 2006
    Messages : 974
    Points : 1 390
    Points
    1 390
    Par défaut
    Salut,

    Pourquoi lors de la compilations les fonctions sont renommées? Elles ne sont pas renommées, elles sont « décorées ». Pourquoi ? Pour 2 choses à ma connaissance : La principale, c'est pour éviter qu'une fonction de l'utilisateur entre en conflit avec une fonction de la librairie du compilateur. La deuxième, ça permet, lors d'un changement de compilateur / environnement, comme tu fais, d'éviter d'assembler des objets de format incompatible provenant d'un autre compilateur. La décoration varie d'un compilateur / environnement à l'autre.

    Généralement, les compilateurs permettent de contourner cette décoration avec diverses méthodes, quand on veut appeler une fonction d'un autre langage par exemple. Peut-être que ton problème vient du fait que tes sources justement forcent la décoration parce qu'il le fallait dans ton ancien environnement, mais c'est peu probable. Il y a beaucoup plus de chance que la source de init_rgn (et autres) n'est pas été recompilée et que l'objet correspondant contienne les fonctions décorées selon l'ancien compilateur, et donc les noms ne correspondent pas, ou bien, l'objet n'est simplement pas trouvable.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/06/2008, 09h22
  2. FRM-41003 : Exécution de cette fonction impossible ici
    Par yasstunisien dans le forum Forms
    Réponses: 3
    Dernier message: 10/12/2007, 09h27
  3. [compilation] Makefile erreur (linkage?)
    Par Valkirion dans le forum C++
    Réponses: 7
    Dernier message: 03/08/2007, 21h24
  4. fonction impossible sur form créée a la volée :s
    Par avogadro dans le forum Débuter
    Réponses: 4
    Dernier message: 06/04/2006, 22h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo