Erreur simple dans l’éditeur de liens en ligne

problème simple:

compte tenu du programme suivant:

#include  inline void addEmUp(int a, int b, int * result) { if (result) { *result = a+b; } } int main(int argc, const char * argv[]) { int i; addEmUp(1, 2, &i); return 0; } 

Je reçois une erreur de l’éditeur de liens …

 Undefined symbols for architecture x86_64: _addEmUp", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

semble ne pas avoir la peine de le comstackr.

je n’aurais pas pensé qu’il ne devrait pas être static , d’après ce que j’ai lu:
Fonction inline error de l’éditeur de liens (car il s’agit d’un object différent et traitant de 2 définitions plutôt que de zéro)

Ceci est un lien apparenté, mais c ++ et je ne pense pas que c’est une bonne pratique en std C de mettre du code dans l’en-tête:
erreur dans l’éditeur de liens de fonction

informations du compilateur:

 cc --version Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) Target: x86_64-apple-darwin12.3.0 Thread model: posix 

exemple de compilation:

 # cc main.c Undefined symbols for architecture x86_64: "_addEmUp", referenced from: _main in main-sq3kr4.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocatio 

Le paragraphe 7 de la section 6.7.4 dit:

Toute fonction avec une liaison interne peut être une fonction en ligne. Pour une fonction avec une liaison externe, les ressortingctions suivantes s’appliquent: Si une fonction est déclarée avec un spécificateur de fonction inline , elle doit également être définie dans la même unité de traduction. Si toutes les déclarations d’étendue de fichier pour une fonction dans une unité de traduction incluent le spécificateur de fonction en inline sans extern , la définition dans cette unité de traduction est une définition en ligne . Une définition en ligne ne fournit pas de définition externe pour la fonction et n’interdit pas une définition externe dans une autre unité de traduction. Une définition en ligne fournit une alternative à une définition externe, qu’un traducteur peut utiliser pour implémenter tout appel à la fonction dans la même unité de traduction. Il n’est pas spécifié si un appel à la fonction utilise la définition en ligne ou la définition externe .

Votre fichier ne contient pas de définition externe de addEmUp et le compilateur a choisi d’utiliser la définition externe dans l’appel in main .

Fournissez une définition externe ou déclarez-la en tant static inline .

Essayez d’append l’option “-O” à votre commande du compilateur. La mise en ligne est activée uniquement lorsque l’optimisation est activée.