in c i i obtenir l'erreur de liaison de la définition multiple de `main '. Oui, c'est vrai, mais:
Pourquoi le lieur tente-t-il d'inclure la deuxième fonction principale (ext.c) bien que je viens d'inclure l'en-tête ext.h? Je m'attendais, le lien de liaison ne relie que les fonctions dont les prototypes ont été trouvés ou qui sont nécessaires à la principale initiale? P>
Comment puis-je résoudre ce problème que a) le test compile et est lié sans problèmes (utilisez simplement le FUNC () de EXT.C) et b) Aussi ext.c peut être compilé et lié comme application distincte? p>
Le code (exemple) Code: p> ... et le module externe: p> i appelez le compilateur avec gcc.c ext.ct -o test code> p> p>
3 Réponses :
Je suppose que votre appel compile / link va comme dans ce cas, test.c et ext.c (resp., pour être exact, les fichiers .o créés en dehors d'eux ) Sont des pairs, i. e. au même niveau. Comment la liaison doit-elle savoir quelle version du symbole Dans le cas d'une fonction principale, la bonne voie à suivre est d'en avoir exactement l'une dans votre projet. P> Pour toute autre fonction où vous avez cette exigence, il existe plusieurs façons d'aller: p> soit, vous pourriez déclarer l'un d'entre eux comme "faible". Il sera jeté quand il y a une "forte". P> ou vous mettez votre fonction dans une bibliothèque, e. g. principal code> à prendre et qui pour supprimer? Le lien de lieur ne connaît pas les fichiers Inclure utilisées. P>
liblet.a code>. Si vous êtes associé à celui-ci avec
-ext code>, seuls les fichiers d'objet qui définissent des symboles non définis sont retirés de celui-ci. Mais là encore, les affrontements de nom peuvent se produire si un autre nom défini par ce fichier d'objet est déjà défini. Il est donc préférable de définir uniquement les symboles par fichier objet que possible. P> p>
Non, on devrait certainement pas b> déclarer la fonction principale code> comme symbole faible.
@Sergeya donc la voie à suivre est de créer une bibliothèque? Est-ce quelque chose que je peux faire automatiquement dans le maquillage? Le projet "réel" que je travaille sur est beaucoup plus compliqué et je suis plus un concepteur matériel ayant à ajouter des fonctionnalités à un système intégré. Décririez-vous le processus de création d'un .a un peu plus?
@LLGLGLG Mise en place ext.o code> dans une bibliothèque, comme c'est le cas, pas i> empêche l'erreur de définition multiple sur UNIX (peut-être que sur Windows, je ne sais pas). La liaison UNIX prend entiers des fichiers d'objet i> sur une bibliothèque code> .a code>, donc lorsque
test.o code> fait référence à
Func code> et cette référence est satisfaite de
ext.o code>, il apportera la définition
ext.o code> de
principal code> aussi.
@Sergeya sauf lors de l'expérimentation et du test des limites de vos outils. Mais principalement vous avez raison, alors j'ai reformulé ma réponse.
Votre module externe ne doit pas avoir puis compilez votre application comme celle-ci: p> et votre test comme celui-ci: p> principal () code> car il s'agit d'un module et non d'une application. Vous devriez simplement déplacer
principal () code> à partir de votre module à un fichier distinct:
Cela ressemble à la voie à suivre. Il convient parfaitement à mon projet (ce fil n'était qu'un exemple pour montrer mon problème). Et le chemin absolu et le vide principal () résultat de l'exemple rapide et sale. BTW Cette solution s'intègre facilement dans le maquillage qui fait partie de mon projet.
in c, vous ne pouvez avoir une définition d'une fonction dans tous les fichiers que vous connaissez dans votre exécutable. Il n'y a pas de bons em> moyen de dire au compilateur "Je souhaite utiliser ce Si vous souhaitez utiliser une fonction avec deux fonctions différentes principal () code> et non tous les autres". (Il y a une mauvaise façon, en utilisant des macros, mais ce serait désordonné). P>
Main () CODE>, mettez-la dans un fichier séparé. P>
Non, tu penses mal. Le compilateur créera un symbole pour chaque fonction qu'il a été fondée (généralement, sauf indication contraire et / ou optimisée) et que la liaison tentera de résoudre ces symboles et que ce ne sera pas des doublons.
Quelle commande utilisez-vous pour compiler ceci? Si vous ne compilez qu'un de ces fichiers
.C code>, le compilateur ne trouvera qu'une seule fonction code> principale code>.
En plus de la réponse donnée, j'aimerais souligner que la séparation du code de test et que l'exécutable final est presque toujours une bonne idée, surtout si vous avez des dépendances uniquement sur des bibliothèques externes.
Additionnellement, la valeur de retour de
principal code> doit être
int code> i>