multiply-defined

multiply-defined - C - Programmation

Marsh Posté le 26-10-2006 à 17:50:55    

Bonsoir toutes et tous,
 
Petite question sur le multiply-defined, comment l'eviter, tout ca, je m'explique:
pour l'instant j'ai 2 fichiers .c qui définissent tous les deux les fonctions:
- create()
- init()
- destroy()
Ces fonctions DOIVENT etre nommés comme cela, et je dois avoir 2 fichiers car j'utilise une appli externe.
 
Question: Comment définir ces fonctions pour qu'elles soient définies/utilisables dans le deux fichiers à la fois?
 

Reply

Marsh Posté le 26-10-2006 à 17:50:55   

Reply

Marsh Posté le 26-10-2006 à 17:55:19    

Salut,
Les déclarer dans un .h et les définir dans un .c normalement. Sinon, j'ai pas pigé la question.

Reply

Marsh Posté le 26-10-2006 à 17:55:29    

J'ai rien compris
 
Les fichiers d'entete, etc, ca te dit quelque chose ?
La surcharge ?
 
Ca veut dire quoi ça, concretement :

Citation :

Ces fonctions DOIVENT etre nommés comme cela, et je dois avoir 2 fichiers car j'utilise une appli externe.


?


---------------
Töp of the plöp
Reply

Marsh Posté le 26-10-2006 à 17:55:58    

[:grilled]


---------------
Töp of the plöp
Reply

Marsh Posté le 26-10-2006 à 18:00:37    

ok j'ai pas ete clair:
 
- je cree une lib
- dedans je veux mettre 2 fichiers qui definissent tous les deux les methodes destroy(), create()
- et je me retrouve avec un multiply-defined symbol

Reply

Marsh Posté le 26-10-2006 à 18:19:28    

Ben, tu les renommes, y'a pas le choix.
Pourquoi 2 fonctions différentes??

Reply

Marsh Posté le 26-10-2006 à 18:23:12    

c'est les memes fonctions, mais elle doivent etre definies dans les deux fichiers...
et je peux pas les renommer, vu que c'est le point d'entree d'une appli externe.
Y'a vraiment pas d'autre choix que de faire 2 libs?

Reply

Marsh Posté le 26-10-2006 à 18:26:38    

déclare les en static
 

_darkalt3_ a écrit :

J'ai rien compris
La surcharge ?


 
justement on est en C la

Reply

Marsh Posté le 26-10-2006 à 18:27:53    

darf a écrit :

c'est les memes fonctions, mais elle doivent etre definies dans les deux fichiers...
et je peux pas les renommer, vu que c'est le point d'entree d'une appli externe.
Y'a vraiment pas d'autre choix que de faire 2 libs?


 
une fonction ne peut pas avoir plusieurs definition, ca ne te parais pas logique ?

Reply

Marsh Posté le 26-10-2006 à 18:37:43    

darf a écrit :

Petite question sur le multiply-defined, comment l'eviter, tout ca, je m'explique:
pour l'instant j'ai 2 fichiers .c qui définissent tous les deux les fonctions:
- create()
- init()
- destroy()


Ben si ces deux fichiers font partie du même projet, ça ne fonctionnera pas : "multiply-defined". C'est logique, non ?

Citation :

Ces fonctions DOIVENT etre nommés comme cela, et je dois avoir 2 fichiers car j'utilise une appli externe.


Je ne vois pas le rapport avec une appli externe. Tu peux préciser ?
 
Question: Comment définir ces fonctions pour qu'elles soient définies/utilisables dans le deux fichiers à la fois?
Dans le même projet, c'est pas possible. Je pense que tu as un problème plus général de conception et d'organisation de ton ou tes projets.
 
Essaye de décrire exactement ce que tu veux faire.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-10-2006 à 18:37:43   

Reply

Marsh Posté le 26-10-2006 à 18:39:00    

si ca me parait logique, mais apres une bonne cure de java je pete un cable sur la rigidite du C ...
pas de namespace, pas de classes :( :(
et pi evidemment je peux pas les declarer static vu que c'est des fonctions "imposées", va pour 2 libs alors ...

Reply

Marsh Posté le 26-10-2006 à 18:41:27    

darf a écrit :


- je cree une lib
- dedans je veux mettre 2 fichiers qui definissent tous les deux les methodes destroy(), create()


Si ils définissent les mêmes fonctions avec les même noms, pourquoi tu mets 2 fichiers ? Tu as essayé avec un seul, il se passe quoi ? Ca marche trop bien ? C'est ça le problème ?

Citation :

- et je me retrouve avec un multiply-defined symbol


Ben oui, c'est normal. Tu fais, en gros, n'importe quoi...


Message édité par Emmanuel Delahaye le 26-10-2006 à 18:45:29

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-10-2006 à 18:42:56    

Description:
j'utilise une api pour creer un plugin sous forme de .so
cette api m'impose comme point d'entree une fonction create() et comme sortie une fonction destroy()
 
or je voulais creer 2 plugins en un si l'on peut dire, et donc definir 2 points d'entree create() et 2 destroy() dans la meme librarie.
Ce qui n'est apparemment pas possible, du coup je vais simplement creer 2 libs

Reply

Marsh Posté le 26-10-2006 à 18:51:07    

darf a écrit :

Description:
j'utilise une api pour creer un plugin sous forme de .so
cette api m'impose comme point d'entree une fonction create() et comme sortie une fonction destroy()
 
or je voulais creer 2 plugins en un si l'on peut dire, et donc definir 2 points d'entree create() et 2 destroy() dans la meme librarie.
Ce qui n'est apparemment pas possible, du coup je vais simplement creer 2 libs


2 plugins, ca veut dire une fois le code, mais 2 fois les données. Il faut apprendre à écrire du code instanciable. Une bibliothèque, c'est fait pour ça...
 
En plus, create() / destroy(), ca le fait bien....

Code :
  1. T *pa = create() /* 1 ere instance */
  2.    T *pb = create() /* 2 eme instance */
  3.    ...
  4.    destroy (pb);
  5.    destroy (pa);


comme fopen()/fclose(), par exemple...
 
http://mapage.noos.fr/emdel/tad.htm


Message édité par Emmanuel Delahaye le 26-10-2006 à 18:51:46

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-10-2006 à 19:02:31    

Ca serait bien si c'etait comme ca...
Mais non, il faut un fichier d'entree pour chaque plugin nomme plugin_1.c et plugin_2.c sachant que ces deux fichiers doivent definir les methodes:
create()
et destroy()
je n'ai pas acces au niveaux superieurs, c'est juniper qui pose les problemes d'architecture  :p

Message cité 1 fois
Message édité par darf le 26-10-2006 à 19:03:05
Reply

Marsh Posté le 26-10-2006 à 19:18:46    

et genre, faire *2* .so ne te parait pas plus logique ?

Reply

Marsh Posté le 26-10-2006 à 20:04:13    

skelter a écrit :

justement on est en C la


Rhâ j'oublie toujours qu'il n'y a pas de surcharge en C  :sweat:  
 

darf a écrit :

Ca serait bien si c'etait comme ca...
Mais non, il faut un fichier d'entree pour chaque plugin nomme plugin_1.c et plugin_2.c sachant que ces deux fichiers doivent definir les methodes:
create()
et destroy()
je n'ai pas acces au niveaux superieurs, c'est juniper qui pose les problemes d'architecture  :p


 
Oui mais l'idée du plugin c'est que le plug en question ne soit pas inclu à la compilation, mais ajouté plus tard sous forme de binaire, comme une dll par exemple.


---------------
Töp of the plöp
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed