12
votes

Comment compiler un projet C avec plus d'une fonction principale?

Je suis nouveau à c et lisez maintenant du manuel et allez appliquer ses exemples.

Le problème est, chaque fois que je crée un nouveau projet et essayer de mettre plus d'un fichier contenant une fonction principale, la liaison (Comme j'explique Thougt0 disant: xxx

(BTW, j'ai utilisé beaucoup d'idées, monodevelop, Qt Creator, VS2010, CodeBloks, ...) Je suis actuellement utilise Qt Creator, il semble être une très belle IDE.

Donc, il n'y a pas de solution de contournement pour résoudre ce problème ??

Edit:

Je demande parce que je suis dans l'étape d'apprentissage et que je ne fais pas de véritable programmation en ce moment. J'ai juste besoin d'un moyen simple de créer des programmes en C sans avoir à créer un projet séparé par exemple. Dans le même temps, je ne veux pas utiliser Gedit / VI + Commandline.

Donc, n'est-ce pas un moyen tel que le nettoyage du projet, puis compilez-le - un seul fichier dont j'ai besoin courir ??? BTW, en Java, nous pouvons organiser un programme qui cotaine plus d'un principal (l'IDE me donne le choix entre eux)


15 Réponses :


0
votes

Je suppose que l'un de vos IDes crée automatiquement un fichier avec une fonction principale . Vérifiez-vous pour voir si on a déjà été créé.


0 commentaires

6
votes

Vous ne pouvez pas avoir plus d'un point d'entrée dans votre application. Lorsque l'exécutable final est démarré, la fonction de point d'entrée (principale) est appelée. Et celui-ci ne peut pas être ambigu.

Donc, si vous vouliez les appeler un à un, vous pouvez les chaîner comme ceci: xxx

Vous pouvez même les appeler en utilisant threads (par exemple, boost.thread), de sorte qu'ils courent parallèlement. Mais vous ne pouvez pas avoir plusieurs fonctions nommées principale liés ensemble.

Si vous voulez que vous soyez des programmes distincts chacun, vous devrez les relier séparément.


0 commentaires

2
votes

Chaque programme doit avoir exactement une fonction principale. Cependant, la principale peut appeler toute fonction que vous souhaitez (y compris elle-même, bien que cela puisse être déroutant). Ainsi, vous devriez casser le programme en parties logiques.


9 commentaires

Main peut s'appeler en C, mais pas en C ++.


Droite. La question semble être à propos de C, malgré la balise C ++.


@Daz: S'il vous plaît, n'utilisez pas d'étiquette non pertinente pour la question juste pour l'attention. Nous examinons les balises lorsque vous fournissez des réponses.


@ Jerry Coffin: Ce n'est pas vrai. Le principal peut s'appeler en C ++. Vous pouvez écrire des programmes valides que la queue recueille principale, redémarrant efficacement eux-mêmes.


@Deadmg: non tellement - §3.6 / 2: "La fonction" Main "ne doit pas être utilisée (3.2) dans un programme." §3.2: "Une fonction objet ou non surchargé est utilisée si son nom apparaît dans une expression potentiellement évaluée." Le nom principal ne peut apparaître dans aucune expression potentiellement évaluée, ce qui l'empêche d'être appelé dans le programme.


@ Jerry Coffin: La norme dit que. En réalité, vous pouvez.


@Deadmg: Non - car la norme dit que vous n'êtes pas autorisé à le faire, si vous le faites, votre code n'est plus "en C ++". C ++ est défini par la norme; Le code qui enfreint la norme n'est pas C ++.


@Jerry Coffin: Le principal est surchargé, sur mon compilateur, il existe de nombreuses formes valides de principale, sans parler des victoires supplémentaires.


@Deadmg, de nombreux compilateurs ont des extensions exclusives et des différences de la norme. Mais ces variations ne font pas partie de C ++. Vous ne pouvez pas écrire un programme C ++ valide qui appelle la principale.



0
votes

Vous ne pouvez pas avoir de définitions multiples de la principale. La fonction "principale" est celle, en substance, définit ce que fait votre programme. Si vous aviez plus d'une copie de la principale, laquelle vous attendriez-vous à être exécutée?

La solution à votre problème est d'utiliser des bibliothèques; Si vous souhaitez réutiliser la fonctionnalité, vous devez créer une bibliothèque, qui est essentiellement identique à un programme, sauf que lorsqu'il a des fonctions et des données (comme un programme), il n'a pas de fonction spéciale appelée "Main", et donc N'a pas de "point d'entrée" où l'exécution devrait commencer quand il serait double-cliqué ou autrement chargé par le système d'exploitation. Les bibliothèques viennent en deux variantes: partagée / dynamique et statique. Soit on devrait faire. Chaque programme que vous créez aurez sa propre fonction principale, mais vous pouvez réutiliser votre bibliothèque sans aucun problème dans différents programmes.

Maintenant quant à l'élément pratique de la création d'une bibliothèque ... Consultez mon Modèle de projet de bibliothèque C ++ .


1 commentaires

La création d'une bibliothèque est excessive pour inclure plusieurs fichiers dans un programme.



10
votes

Qu'essayez-vous de faire avec les fonctions multiples principales ?

Si vous essayez de compiler plusieurs programmes différents à la fois, vous devez compiler chacun d'eux séparément (c'est-à-dire un seul principal par programme).

Si vous essayez de compiler un programme et que vous souhaitez que le multiple principale fonctionne tous à exécuter, vous ne pouvez pas. Vous devez spécifier un seul principal et renommer les autres à quelque chose d'autre (et appelez-les à partir du célibataire principal dans l'ordre de votre choix).

Si vous essayez d'utiliser uniquement l'un des fonctions principales comme point d'entrée unique sur votre programme et ignorez les autres, vous ne devez pas inclure les fichiers avec l'autre principal < / code> S quand vous êtes en train de relier. Je suggère de placer chaque principal dans un fichier séparé si vous souhaitez les garder, et n'inclut que l'un de ces fichiers principaux lorsque vous vous trouvez / compiler.

Si vous obtenez cette erreur par erreur, vous faites probablement quelque chose de mal avec le projet dans votre IDE. Peut-être que vous essayez accidentellement de compiler plusieurs programmes différents en un? Vous devrez peut-être spécifier chaque fichier contenant un principal en tant que produit de construction distinct. C n'est pas comme Java où vous pouvez mettre une méthode principale à l'intérieur de chaque classe et spécifier lequel à appeler; Le principal in c est un nom global.


0 commentaires

0
votes

Comme d'autres les ont dit, votre projet ne peut avoir qu'une seule fonction principale.

Pourquoi essayez-vous d'avoir plus d'une fonction principale? Est-ce parce que vous mettez plusieurs petits exemples de programmes dans un seul projet et chacun de ceux-ci a une principale? Si tel est le cas, vous devrez peut-être créer un projet séparé pour chaque exemple de manière à ce que votre IDE ne demande pas au compilateur de compiler / relier la source de plusieurs exemples dans un programme. Votre IDE pourrait également prendre en charge un concept comme une cible, qui vous permet de conserver le code pour plusieurs programmes connexes dans un projet et que de choisir le programme (cible) à construire réellement. L'IDE compilera ensuite / liera uniquement les fichiers de cette cible.


0 commentaires

2
votes

Autant de personnes l'ont dit, vous ne pouvez avoir qu'un seul par programme principal. Vous ne voulez pas suivre les tracas de créer un nouveau projet pour chaque exemple que vous passez par un livre. C'est compréhensible, mais vous devrez faire fondamentalement cela. Je vois deux alternatives:

  1. Utilisez la nouvelle fonction de projet dans votre IDE (comme VS2010). Cela fera tout le travail difficile pour vous. Vous pouvez toujours les supprimer plus tard.
  2. Si vous ne vous souciez pas de garder le code autour, videz simplement le fichier (ou même la fonction principale) et réutilisez-le. Avec des exemples de livres, vous ne revisiterez probablement jamais le code de toute façon, alors supprimez-la simplement.

0 commentaires

0
votes

Essayez d'utiliser le mot-clé statique, par exemple:

File1.cpp: P>

#ifdef RUN_FILE2
#define STATIC static
#else
#define STATIC
#endif

int STATIC main(int argc, char **argv(){}


2 commentaires

Je pense qu'il serait préférable de comprendre comment obtenir l'EDI de compiler uniquement le programme souhaité que de jongler avec le préprocesseur.


Quoi qu'il en soit, il semble que la solution dans une forme ci-dessus n'est pas autorisée - Stackoverflow.com/Questtions/320461/... Je ne connais pas la raison ou la norme exacte pour cela.



0
votes

Si vous utilisez MS Linker, utilisez l'option / Force: plusieurs options de liaison. Le premier symbole principal rencontré va gagner. Je ne sais pas quelle est l'option pour les autres lieurs.


0 commentaires

1
votes

En réalité, je trouve Dev-C ++ prend en charge de travailler sur plusieurs fichiers principaux qui ne font partie d'aucun projet, afin que je puisse créer une exécution autant de fichiers que j'ai besoin.

merci à toutes les sociétés de l'OMS ici :) Gokok Luck pour tous.

Aussi, pour Linux / Win I Code trouvé Code :: Les blocs font ce truc. merci.


0 commentaires

0
votes

Eh bien, je pense que QTCreator est un excellent IDE.

Pour apprendre et tester, il serait agréable de pouvoir avoir plusieurs réseau pour la facilité d'utilisation, cependant, comme expliqué avant de pouvoir avoir un seul parce que c'est la façon dont un projet est défini dans les fichiers qtcreator / .pro qmake.

Vous pouvez créer plusieurs cibles dans les fichiers Pro ou CARE / CMAKE.

mais pour les tests, je l'ai fait Le fichier .pro pour le projet.


xxx

donc je viens d'échanger le nom du fichier principal de la variable appelée principale dans le fichier PRO. L'utilisation dans la variable sources.

Comme vous pouvez le constater, je teste plusieurs implémentations d'arbres. À l'heure actuelle, testez une simple variation d'arbres où je teste une nouvelle implémentation pour rechercher un nœud spécifique, avant de les tester sur l'arborescence équilibrée.

La méthode n'est cependant pas parfaite, car vous ne pouvez pas avoir les mêmes noms pour les fonctions etc. Et après un certain temps, je peux être difficile à proposer de nouveaux noms pour Find_Node () ou Traverse_tree ()


3 commentaires

Vous ne pouvez avoir qu'un seul élément principal car c'est la manière dont un projet est défini dans QTCreator : Non, vous ne pouvez avoir qu'un seul principal à cause de la norme C, non pas à cause de QTCreator ...


Vous ne pouvez avoir qu'une seule unité de compilation, l'IDE pourrait fournir une fonctionnalité un niveau au-dessus du compilateur et du chargeur qui choisit le principal à utiliser et à inclure dans l'unité de compilation, alors c'est exactement ce qui est demandé. L'IDE devrait contrôler facilement ce que l'on veut inclure dans l'unité de compilation, il s'agit d'une solution de contournement, il s'agit d'une distinction entre ce qui se passe dans l'IDE et que se passe-t-il avec le compilateur et le chargeur. Mais QCreator fonctionne directement avec les fichiers QMake.


L'utilisateur ci-dessus Cognac est moi, la réponse et le commentaire ci-dessus (pourquoi ont-ils le même nom d'utilisateur?)



0
votes

Dans QTCreator, vous pouvez cliquer avec le bouton droit sur un fichier et sélectionner l'option "Compiler", qui compilait uniquement le fichier sélectionné et les dépendances requises. Donc, si vous compilez l'un de vos fichiers principaux comme celle-ci et que ce fichier n'inclut aucun autre fichier principal, cela devrait fonctionner.


0 commentaires

0
votes

La meilleure solution que je puisse trouver était sur Eclipse Créer des projets à chaque fois pour exécuter un seul fichier? Il possède certaines alternatives que de créer un nouveau projet pour chaque programme.


0 commentaires

4
votes

Vous pouvez avoir plus d'une principale dans le même projet, si à chaque principale correspondre à un exécutable différent dans l'arborescence de la répertoire de construction.

L'exemple suivant utilise CMAKE, je ne sais pas si cela peut être fait avec un autre logiciel de gestionnaire de processus de construction. p>

Stockez les deux fichiers .CPP suivants dans un dossier appelé source em> et nommez-les Square_root.cpp, et Power_of_TWO.CPP: P >

square_root.cpp: p> xxx pré>

Power_of_two.cpp: p> xxx pré>

Notez qu'ils contiennent tous les deux une méthode principale . Ensuite, dans le même dossier, ajoutez un .txt appelé cmakelists.txt: il indiquera au compilateur le nombre d'exécutables, comment les appeler et où trouver le (s) principal (s). P>

CMAKELIST.TXT : P>

→  ./Square2 5
The square root of 5 is 2.23607
 →  ./Power2 5
The power of two of 5 is 25


4 commentaires

Merci. Un autre quesiton, lorsque vous avez dit "Créer un nouveau dossier appelé Build dans la même racine de la source", voulez-vous dire dossier Build doit partager le même dossier racine du dossier Source , comme les deux Build et source doit dans le même dossier racine, dites, ./ ?


Désolé, j'ai écrit cette réponse il y a 3 ans et entre-temps, j'avais même oublié que je connaissais C ++ ...


... Maintenant que je me souviens, oui la source et la construction peuvent partager le même dossier racine. Certains programmeurs intègrent la construction de la source, mais je ne pense pas que ce soit une bonne pratique, en particulier si la source est contrôlée vers la version ou Build (code> Build n'est pas dans le .gitignore fichier.


MDR. Merci pour la note! (P.S, il est réconfortant de savoir que les codeurs cool oublient une langue de programmation si elle ne l'utilise pas beaucoup. Moi aussi!)



0
votes

non: strong> J'ai expliqué ici pour CPP strong> mais si vous voulez faire pour C STROND> Juste besoin de changer de compilateur g ++ strong> à GCC fort>.

C'est une ancienne question mais je pense que je comprends la question que vous avez posée. p>

Oui, comme vous l'avez dit, dans un projet, nous Besoin d'utiliser plus de 1 fichier comme Main.Cpp fort>, test1.cpp strong>, et ainsi de suite, nous avons le droit de n'avons qu'un seul ' principal () 'fonction dans le projet. p>

mais, lorsque vous souhaitez un test autonome pour n'importe quel fichier CPP, l'invite de compilateur " où est ma précieuse fonction principale () ou _start () Dans ce fichier? em> ", la sortie Terminal comme: p> xxx pré>

La solution est l'utilisation de #Ifdef / #endif strong> Mécanisme. Comme ci-dessous: p>

Un exemple de structure de projet: p>

Entrez la description de l'image ici p>

Fonction MAIN.CPP: P> xxx pré>

Notre script de test, code CPP (vector_test.cpp): p> xxx pré>

Donc, lorsque vous exécutez votre projet ne recevant jamais de compilation Erreur de temps car vous masquez l'autre fonction principale des autres scripts à l'aide de #Ifdef. p>

Lorsque vous devez tester n'importe quel script, il suffit d'ajouter un paramètre dans la compilation comme ci-dessous: P>

def main():
    #do somethings

if __name__ == "__main__":
   main()


0 commentaires