2013-05-24 2 views
7

problème simple:simple C erreur de liens en ligne

donné le programme suivant:

#include <stdio.h> 

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 linker ...

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 que ce ne est pas prendre la peine de le compiler.

il ne devrait pas être static, je ne pense pas, en fonction de ce que je lis dans:
Linker error inline function (comme cela est dans un autre objet, et de traiter avec 2 définitions plutôt que zéro)

Ceci est un lien connexe, mais il est C++ et je ne pense pas que ce soit une bonne pratique dans std C pour mettre le code dans l'en-tête:
inline function linker error

info 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 
+0

quelle commande vous avez utilisée pour compiler? –

+0

Quel compilateur utilisez-vous? – Evans

+0

il est clang dans xcode 4.6.2 –

Répondre

11

Le paragraphe 7 de l'article 6.7.4 dit:

Toute fonction avec liaison interne peut être une fonction en ligne. Pour une fonction avec liaison externe, les restrictions 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 de portée de fichier pour une fonction dans une unité de traduction incluent le spécificateur de fonction 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 de 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 n'importe quel 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 à main.

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

+0

statique inline n'a pas fonctionné (du moins pas dans le projet réel, n'a pas essayé l'échantillon un) ... J'ai trouvé une macro spécifique à Objective-C qui fonctionne, je suis en train de mise à jour. –

+0

'static inline' _ought_ au travail, cependant. Pouvez-vous le résumer assez loin que l'erreur de l'éditeur de liens reste mais le code est assez petit pour SO? –

+0

oui cela fonctionne dans l'échantillon. upvote et réponds! –

3

Essayez d'ajouter l'option "O" à votre commande du compilateur. Inline est activé uniquement lorsque l'optimisation est activée.

+0

qui prend l'erreur de l'éditeur de liens, mais ne devrait pas ignorer le mot-clé si elle ne peut pas en ligne ... comme c'est juste un indice de toute façon –

+0

C'est ce que GCC fait. Clang essaie de se conformer à C99, qui a une interprétation légèrement différente, ce qui explique pourquoi vous rencontrez ce problème. http://clang.llvm.org/compatibility.html # inline – Ziffusion

+0

bonne recherche +1 –