Effectivement déclarer le corps de fonction à scope global dans un ".h", c'est
pas des meilleurs pratiques...
La solution sale et rapide, c'est de rajouter "static" devant chaque fonction
déclarée dans ludcmp.h. Mais il y aura une instance binaire de la fonction par
.o qui incluera ludcmp.h . Tout a fait acceptable pour du code de recherche ou
interne.
Le 29/05/2024 à 22:10, Patrick Dupre a écrit :
> Bonsoir,
>
> J'utilise la numerical recipes 3
> Il y un include
> ludcmp.h
> que j'utilise dans 4 routines,
> 2 fois dans 2 routines d'un meme fichier A.cpp
> 2 fois dans 2 routines d'un autre fichier B.cpp
> Tout se passe bien si je lie 1 seul des 2 fichiers, cas A.o ou B.o
> au programme principal.
> Par contre le linkeur n'est pas contant si je lie les 2 objet A.o et B.o
>
> Typîqueùent, je fais
> #include <ludcmp.h>
> dans A.cpp et B.cpp
> et
> LUdcmp SOE (*par_soe -> mat) ;
> SOE.solve (*par_soe -> Lambda, rho) ;
> dans les 4 routines
>
> A.cpp:(.text+0x0): multiple definition of `LUdcmp::solve(NRvector<double> const&, NRvector<double>&)'; B.o:B.cpp:(.text+0x0): first defined here
> /usr/bin/ld: A.o: in function `LUdcmp::solve(NRmatrix<double> const&, NRmatrix<double>&)':
> A.cpp:(.text+0x3a0): multiple definition of `LUdcmp::solve(NRmatrix<double> const&, NRmatrix<double>&)'; B.o:B.cpp:(.text+0x3a0): first defined here
> /usr/bin/ld: B.o: in function `LUdcmp::inverse(NRmatrix<double>&)':
> B.cpp:(.text+0x540): multiple definition of `LUdcmp::inverse(NRmatrix<double>&)'; A.o:A.cpp:(.text+0x540): first defined here
> /usr/bin/ld: B.o: in function `LUdcmp::det()':
>
> Pourquoi ce conflit ?
>
> Les varaibles SOE ont des adresse differents.
> Pourquoi le function solve pose probleme ?
>
> Est-ce qu'il y a une option a passer au linkeur ?
> Suis-je condamne a faire un librairie dynamique ?
> Ou bien je n'ai pas compris quelque chose ?
>
> Merci.
>
> ===========================================================================
> Patrick DUPRÉ | | email: pdupre@???
> ===========================================================================
>
>