Re: Question de c/cpp

Top Page

Reply to this message
Author: Raphaël Dorado
Date:  
To: Patrick Dupre, guilde
Subject: Re: Question de c/cpp
Oui, il faut simplement modifier ludcmp.h et rajouter "static" devant chaque
déclaration de fonction, comme tu écris :

static void LUdcmp::solve(VecDoub_I &b, VecDoub_O &x)

Le 30/05/2024 à 09:12, Patrick Dupre a écrit :
> Merci pour le retour,
>
> Pas sur de tout comprendre,
> Je ne touche pas au ludcmp.h
> je fais
> static SOE.solve (*par_soe -> Lambda, rho) ;
> static devant ?
> std::cout << SOE.det () << " " ;
>
> Je n'utilise jamais static.
>
> ou bien je dois modifier
> ludcmp.h
>
> avec static void LUdcmp::solve(VecDoub_I &b, VecDoub_O &x)
>
> ou
> je cree un
> ludcmp.cpp
>
>
>
> ===========================================================================
>   Patrick DUPRÉ                                 | | email: pdupre@???
> ===========================================================================

>
>
>> Sent: Wednesday, May 29, 2024 at 11:31 PM
>> From: "Raphaël Dorado" <rdorado@???>
>> To: guilde@???
>> Subject: Re: Question de c/cpp
>>
>> 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@???
>>> ===========================================================================

>>>
>>>
>>
>>
>>