0
votes

Plusieurs définitions de la principale -> Comment ajouter uniquement certaines fonctions d'un autre en-tête?

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?

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?

Le code (exemple) Code: xxx PRE> xxx

... et le module externe: xxx xxx

i appelez le compilateur avec gcc.c ext.ct -o test


4 commentaires

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 , le compilateur ne trouvera qu'une seule fonction principale .


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 doit être int


3 Réponses :


0
votes

Je suppose que votre appel compile / link va comme xxx

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 principal à prendre et qui pour supprimer? Le lien de lieur ne connaît pas les fichiers Inclure utilisées.

Dans le cas d'une fonction principale, la bonne voie à suivre est d'en avoir exactement l'une dans votre projet.

Pour toute autre fonction où vous avez cette exigence, il existe plusieurs façons d'aller:

soit, vous pourriez déclarer l'un d'entre eux comme "faible". Il sera jeté quand il y a une "forte".

ou vous mettez votre fonction dans une bibliothèque, e. g. liblet.a . Si vous êtes associé à celui-ci avec -ext , 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.


4 commentaires

Non, on devrait certainement pas déclarer la fonction principale 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 dans une bibliothèque, comme c'est le cas, pas 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 sur une bibliothèque .a , donc lorsque test.o fait référence à Func et cette référence est satisfaite de ext.o , il apportera la définition ext.o de principal 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.



6
votes

Votre module externe ne doit pas avoir principal () car il s'agit d'un module et non d'une application. Vous devriez simplement déplacer principal () à partir de votre module à un fichier distinct: xxx

puis compilez votre application comme celle-ci: xxx < / pré>

et votre test comme celui-ci: xxx


1 commentaires

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.



1
votes

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 moyen de dire au compilateur "Je souhaite utiliser ce principal () et non tous les autres". (Il y a une mauvaise façon, en utilisant des macros, mais ce serait désordonné).

Si vous souhaitez utiliser une fonction avec deux fonctions différentes Main () , mettez-la dans un fichier séparé.


0 commentaires