Pourquoi est-ce que lorsque vous ne définissez pas une fonction, vous obtenez une erreur de l’éditeur de liens et non un compilateur?

Par exemple

#include  int add(int x, int y); int main() { cout << add(5, 5) << endl; } 

Cela permettrait de comstackr mais pas de lien. Je comprends le problème, je ne comprends tout simplement pas pourquoi il comstack bien mais ne crée pas de lien.

L’entrée dans un compilateur C ou C ++ correspond à une unité de traduction – plus ou moins à un fichier de code source. Une fois que le compilateur a terminé avec ce code source, il a fait son travail.

Si vous appelez / utilisez un symbole, tel qu’une fonction, qui ne fait pas partie de cette unité de traduction, le compilateur suppose qu’il est défini ailleurs.

Plus tard, vous liez tous les fichiers d’objects et éventuellement les bibliothèques que vous voulez utiliser. Toutes les références sont liées. C’est seulement à ce stade que, lorsqu’on rassemble tout ce qui est censé créer un exécutable, on peut savoir qu’il manque quelque chose.

Parce que le compilateur ne sait pas si cette fonction est fournie par une bibliothèque (ou une autre unité de traduction). Rien dans votre prototype n’indique au compilateur que la fonction est définie localement (vous pouvez utiliser static pour cela).

Lorsqu’un compilateur comstack, il génère la sortie (fichier object) avec la table des symboles définis (T) et des symboles non définis (U) (voir la page de manuel de nm ). Il n’est donc pas nécessaire que toutes les références soient définies dans chaque unité de traduction. Lorsque tous les fichiers objects sont liés (avec toutes les bibliothèques, etc.), le binary final doit avoir tous les symboles définis (à moins que la cible en elle-même ne soit une bibliothèque). C’est le travail de l’éditeur de liens. Par conséquent, en fonction du type de cible demandé (bibliothèque ou non), l’éditeur de liens peut ne pas donner ou peut donner une erreur pour des fonctions non définies. Même si la cible est une non-bibliothèque, si elle n’est pas liée statiquement, elle peut toujours faire référence à des bibliothèques partagées (.so ou .dll), donc si sur la machine cible pendant l’exécution du binary, si les bibliothèques partagées sont manquantes. ou si des symboles manquent, vous pourriez même avoir une erreur de l’éditeur de liens. Par conséquent, entre le compilateur, l’éditeur de liens et le chargeur, chacun essaie de vous fournir au mieux la définition de chaque symbole nécessaire. Ici en donnant déclarant add, vous pacifiez le compilateur, qui espère que l’éditeur de liens ou le chargeur fera le travail requirejs. Puisque vous n’avez pas pacifié l’éditeur de liens (en lui fournissant par exemple une référence de bibliothèque partagée), il s’arrête et cribs. Si vous avez même pacifié l’éditeur de liens, vous auriez eu l’erreur dans le chargeur.