web-dev-qa-db-fra.com

Que signifie l'erreur de compilation "Symboles non définis pour l'architecture x86_64"?

J'essaie de programmer une classe graphique en utilisant une liste adjacente d'un exemple dans mon livre de texte C++, et quand je compile en utilisant cette commande: Code: g ++ -o prog program.cpp ... J'obtiens l'erreur suivante:

Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

... qu'est-ce que cela signifie dans le monde? Cela peut s'avérer être un problème avec mon code, mais j'ai l'impression que cela peut être plus profond que cela, car j'ai obtenu cette même erreur apparemment inexplicable pour plusieurs projets différents, dont beaucoup ont été résolus de différentes manières, et malheureusement complètement par accident.

J'ai lu quelque part que cela peut avoir à voir avec l'utilisation de bibliothèques 32 bits ou 64 bits et que les balises -m32 ou -m64 peuvent devoir être utilisées, mais je ne sais pas si cela s'applique ici. Chose intéressante, lorsque j'ai essayé d'ajouter la balise -m64, j'ai eu la même erreur exacte, mais quand j'ai essayé d'utiliser la balise -m32, j'ai eu la même erreur, sauf qu'elle disait

Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

au lieu.

Je veux surtout savoir ce que l'erreur dit dans le monde. Je suis habitué à déboguer les erreurs de compilation qui donnent une ligne spécifique dans le code, etc., mais je ne peux rien discerner de tel à partir de cela. Des idées?

Si cela aide, j'utilise un Macbook fin 2008 avec Intel Core 2 Duo (donc 64 bits), et j'utilise OS X Lion (10.7.2), qui je pense est la dernière version. En outre, j'utilise la version 4.2.1 de gcc.

34
gravity black

Lorsque vous compilez le fichier, le compilateur appelle l'éditeur de liens qui essaie de générer un exécutable. Mais ce n'est pas possible car vous n'avez pas fourni de fonction nommée main qui est la fonction qui sera exécutée au lancement de votre programme.

Soit vous ne voulez pas exécuter l'éditeur de liens car vous voulez compiler plusieurs fichiers séparément puis les combiner ensuite. Dans ce cas, utilisez le -c flag pour dire au compilateur de sauter l'étape de liaison.

Soit vous souhaitez exécuter le fichier compilé. Ensuite, vous devez implémenter la fonction main.

41