Je reçois l'erreur
Symbol(s) not found for architecture x86_64
Essayer de compiler un projet sur QtCreator. Cela se produit lorsque j'essaie de créer une instance d'une classe définie par l'utilisateur, Layer
. Cette classe comprend un en-tête, layer.h
, et une implémentation, layer.cpp
. Il a été testé et fonctionne dans d'autres programmes. Sur mon projet, il est inclus dans qtwidget.h
et l'erreur se produit lorsque j'essaie de l'utiliser sur qtwidget.cpp
. Par exemple:
Layer<double> text("pq.txt",0.5,0.5,0.5);
Avoir cette ligne sur qtwidget.cpp
est suffisant pour que l'erreur apparaisse.
C'est une erreur tellement générique que je ne sais pas trop comment l'isoler davantage, mais si cela peut aider, j'ai inclus l'ensemble du projet sur this git repo .
À mon avis, le message d'erreur affiché par Qt Creator est assez trompeur tant que vous ne le comprenez pas, mais n'empêche pas le fractionnement de la classe de modèle en un en-tête et un fichier d'implémentation. Si vous pensez au message:
Symbol(s) not found for architecture x86_64
le problème, je pensais au départ que lorsque j'ai vu cela, c’est qu’il énonce cette erreur lui-même dans la sortie Issues et peut amener l’utilisateur à penser que le problème est dû à l’architecture. En réalité, tout ce qu’il dit, c’est qu’il existe un symbole défini (souvent une fonction) dont la mise en œuvre correspondante n’a pas été trouvée.
Si vous passez de Issues à la fenêtre Compile Output et que vous faites défiler l'écran vers le haut, vous pourrez voir exactement quels symboles ne peuvent pas être trouvés; le mien est affiché en rouge. Il est simplement ennuyeux que le détail du ou des symboles manquants n'apparaisse pas dans la vue Issues.
Il est facile de reproduire cette erreur en ajoutant simplement une définition de fonction dans un en-tête et sans implémenter la fonction, appelez-la à partir du fichier .cpp. Vous verrez alors quelque chose comme ceci dans la fenêtre des problèmes.
Le passage à la vue Compile Output et le défilement vers le haut affichent ceci: -
Nous voyons donc maintenant que le problème est que la fonction DoSomeStuff de la classe PGGui est appelée à partir du constructeur PGGui :: PGGui, mais que le corps de DoSomeStuff est manquant car son symbole est introuvable.
Heureusement, j’ai réussi à résoudre mon problème avant toute réponse. Ainsi, si quelqu'un éprouve des difficultés similaires, il semble que vous _ {vous ne pouvez pas scinder une classe basée sur un modèle en un fichier .cpp et un fichier .h} _. Le fait de remettre toutes les déclarations du fichier .cpp
dans le .h
a résolu le problème.
Cependant, il me restait un problème: les symboles dupliqués (c'est la raison pour laquelle je l'ai scindé). Cette fois, déclarer une variable comme étant external
dans le .h
et le redéclarer sans le mot clé external
dans un (et un seul) fichier .cpp
résolvait le problème pour de bon.
Pour moi, ce problème résultait de la non reconstruction du fichier make après l'ajout d'un autre fichier source et d'un en-tête.
Sous Build: Cleanall-> run qMake-> run
corrigé l'erreur pour moi.
Le problème dans mon cas était que j'avais un projet avec beaucoup de sous-projets et qu'un des fichiers pro des sous-projets était vide.
Pour moi, j'ai oublié d'écrire le nom de l'objet de classe lors de la déclaration de la fonction dans un fichier .cpp.
faux: int Zero(int &num)
à droite: int Common2::Zero(int &num)
Où Common2 est la classe.