2013-05-24 13 views
7

einfaches Problem:Einfache C Inline-Linker-Fehler

gegeben folgendes Programm:

#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; 
} 

ich einen Linker-Fehler erhalten ...

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) 

scheint, als ob es nicht der Fall ist Mach dir Mühe, es zu kompilieren.

es sollte nicht brauchen static zu sein, würde ich nicht denken, auf dem, was ich in gelesen habe:
Linker error inline function (wie dies in einem anderen Objekt ist, und der Umgang mit zwei Definitionen statt Null)

Dies ist eine verwandte Verbindung, aber es ist C++, und ich glaube nicht, dass es in std C gute Praxis ist Code in der Kopfzeile zu setzen:
inline function linker error

Compiler Info:

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 

Kompilation Beispiel:

# 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

Welchen Befehl haben Sie verwendet, um zu kompilieren? –

+0

Welchen Compiler benutzen Sie? – Evans

+0

es ist in xcode 4.6.2 –

Antwort

11

Ziffer 7 des Abschnitts 6.7.4 sagt:

Jede Funktion mit interner Bindung eine Inline-Funktion sein kann. Für eine Funktion mit externer Verknüpfung gelten folgende Einschränkungen: Wenn eine Funktion mit einem Funktionsbezeichner inline deklariert ist, muss sie auch in derselben Übersetzungseinheit definiert sein. Wenn alle Dateibereichsdeklarationen für eine Funktion in einer Übersetzungseinheit den Funktionsspezifizierer inline ohne extern enthalten, ist die Definition in dieser Übersetzungseinheit eine Inline-Definition. Eine Inline-Definition bietet keine externe Definition für die Funktion und verbietet keine externe Definition in einer anderen Übersetzungseinheit. Eine Inline-Definition bietet eine Alternative zu einer externen Definition, die ein Übersetzer verwenden kann, um einen Aufruf der Funktion in derselben Übersetzungseinheit zu implementieren. Es ist nicht angegeben, ob ein Aufruf der Funktion die Inline-Definition oder die externe Definition verwendet.

Ihre Datei enthält keine externe Definition von addEmUp, und der Compiler wählte die externe Definition im Aufruf in main zu verwenden.

Geben Sie eine externe Definition an oder deklarieren Sie sie als static inline.

+0

statische Inline hat nicht funktioniert (zumindest nicht im realen Projekt; habe nicht versucht Probe eins) ... Ich fand ein Objective-C-spezifische Makro, das funktioniert, bin ich dabei Aktualisierung. –

+0

'static inline' _ought_ zu arbeiten, obwohl. Kannst du es so weit herunterkochen, dass der Linker-Fehler bleibt, aber der Code ist klein genug für SO? –

+0

ja es funktioniert in der Probe. Upvote und Antwort! –

3

Versuchen Sie, die "O" Option zu Ihrem Compiler-Befehl hinzufügen. Das Inlining wird nur aktiviert, wenn die Optimierung aktiviert ist.

+0

kling, die den Linker-Fehler entfernt, aber sollte es nicht ignorieren das Schlüsselwort, wenn es nicht inline ... wie es ist nur ein Hinweis sowieso –

+0

Das ist, was GCC tut. Clang versucht, C99 zu erfüllen, was eine etwas andere Interpretation zu haben scheint, weshalb Sie auf dieses Problem stoßen. http://clang.llvm.org/compatibility.html # inline – Ziffusion

+0

gute Forschung +1 –