Warum erhalte ich clang: error: linker command failed with exit code 1?

Lesezeit: 5 Minuten

Benutzer-Avatar
Hendrik

Ich bin ein Neuling, der sich mit Xcode langsam durch K&R arbeitet. Im Abschnitt Funktionen habe ich den Code für ihr Beispiel der Potenzfunktion wie folgt eingegeben.

#include <stdio.h>

int power(int m, int n);

int main()
{
int i;

for (i=0; 1<10; ++i)
    printf("%d %d %d\n", i, power(2,i), power(-3,i));

return 0;
}

Wenn ich versuche es auszuführen erscheint folgender Fehler:

Undefined symbols for architecture x86_64:
  "_power", 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)

Ich habe viele Antworten auf diese Frage gelesen, kann aber nicht erkennen, wie sie auf meine Situation mit einem so kleinen Programm zutrifft.
Wäre für jede Hilfe dankbar.

  • Weil die power Funktion nicht vorhanden?

    – Benutzer253751

    4. Dezember 2015 um 4:20 Uhr

  • power(int m, int n) Funktion nicht definiert.

    – Himanshu

    4. Dezember 2015 um 4:20 Uhr


  • überprüfen Sie hier stackoverflow.com/questions/11704448/…

    – Saurabh-Agarwal

    4. Dezember 2015 um 4:22 Uhr

  • Ich dachte, es wäre in Wie definiere ich es, wenn es nicht da ist?

    – Hendrik

    4. Dezember 2015 um 4:23 Uhr

  • 1<10 sollte sein i<10

    – MM

    4. Dezember 2015 um 4:27 Uhr

Benutzer-Avatar
Punit Vara

Warum erhalte ich clang: error: linker command failed with exit code 1?

Sie haben gerade die Funktion deklariert. Es gibt keine Definition im Code. Zum Zeitpunkt des Verknüpfungsprozesses kann der Compiler (hier clang) nicht verknüpfen power Funktion zu ihrer Definition, sodass der Linker in dieser Art von Situation den Fehler auslöst. Wenn Sie definieren

int power(int x, int y)  
         { 
               \*do calculation*/
         }

Dann kann der Linker Ihre Erklärung von verlinken power Funktion zu seiner Definition, erhalten Sie keinen Fehler.

Für die Ganzzahl habe ich eine Funktion für Sie erstellt.

#include <stdio.h>
int power(int base, int exp);
int main()
{
int i;

for (i=0; i<10; ++i)
    printf("%d %d %d\n", i, power(2,i), power(-3,i));

return 0;
}

int power(int base, int exp)
{
    int result = 1;
    while (exp)
    {
        if (exp & 1)
            result *= base;
        exp >>= 1;
        base *= base;
    }

    return result;
}

Kompilieren Sie diese mit gcc file.c

Hoffe du verstehst die Funktion. Viel Glück 🙂

  • Die Verwendung eines Double als Schleifenbedingung ist aufgrund möglicher Gleitkomma-Rundungsfehler keine gute Idee (vorausgesetzt, Sie meinten i < 10)

    – MM

    4. Dezember 2015 um 4:28 Uhr


  • Ohh, ich werde Ihren Vorschlag prüfen und die Antwort aktualisieren. Vielen Dank 🙂

    – Punit Vara

    4. Dezember 2015 um 4:29 Uhr


  • Diese Antwort wäre besser, wenn Sie erklären würden, warum der Code von OP nicht funktioniert. Und wahrscheinlich sollte erwähnt werden, dass die Mathematikbibliothek mit verknüpft werden muss -lm.

    – Kaylum

    4. Dezember 2015 um 4:30 Uhr

  • @kaylum … wenn Sie einen alten, naffen Compiler verwenden

    – MM

    4. Dezember 2015 um 4:31 Uhr

  • @MM Wollen Sie damit sagen, dass neuere Compiler dies nicht benötigen? -lm? Das wusste ich nicht.

    – Kaylum

    4. Dezember 2015 um 4:33 Uhr


Benutzer-Avatar
rostig

Sie haben die Definition der Funktion verpasst int power (int base,int n) die nach Ihren Hauptenden auf der nächsten Seite des Buches angegeben ist.

Wenn Sie den Prototyp einer Funktion deklarieren, müssen Sie definieren, was sie tun soll. Sie haben gerade die Power-Funktion deklariert und das nie definiert. Deshalb haben Sie einen Fehler erhalten.

Fügen Sie die folgende Definition hinzu, Ihr Code wird so kompiliert, wie Sie es möchten.

int power (int base,int n){
int i,p;
p=1;
for (i=1;i<=n;++i)
p=p*base;
return p;
}

ANTWORT VORBEARBEITEN
JETZT IST DAS NICHT RELEVANT, ABER NÜTZLICH

Ich denke, Sie möchten die Funktion verwenden pow() definiert in math.h.

double pow(double a, double b)

Die C-Bibliotheksfunktion pow(double a, double b) kehrt zurück a zur Potenz erhoben b. Diese Funktion gibt einen doppelten Wert zurück, um den korrekten Bezeichner zu drucken "%lf".

In diesem Fall müssen Sie nur die Header-Datei einschließen

#include<math.h>

In Ihrem Programm.

Eine Funktionsdeklaration ist nicht erforderlich int power(int m, int n);

Der Fehler, den Sie haben, liegt daran, dass Sie I als einen der Parameter angeben pow()
denn wenn Sie Ihren Code kompilieren (nach dem Einschließen math.h und verwenden pow() ersetzen i mit beliebigen Ganzzahlen wird Ihren Code kompilieren und die richtige Ausgabe liefern.

printf("%lf %lf %lf\n", i, pow(2,3), pow(3,2));

Dies wird Ihnen das richtige Ergebnis liefern, aber wenn Sie es mit kompilieren

for (i=0; i<10; ++i){
printf("%lf %lf %lf\n", i, pow(2,i), pow(-3,i));
}

Es wirft den gleichen Fehler, also denke ich pow() nimmt nur Konstanten als Eingang, damit es nicht einläuft for Schleife.

Und wenn Sie nicht einschließen möchten math.h Sie können einfach deklarieren

extern double pow (double base, double exponent); 

Das wird korrekt mit dem Bibliothekscode verknüpft, ohne die zu verwenden math.h include-Datei, hier ist ein Beispiel.

int main() {
extern double pow (double base, double exponent);
printf("%lf",pow( 8.0, 8.0 ));
return 0;
} 

Mehr dazu pow() Sie können die Manpage unter Linux überprüfen, dh man pow.

  • viel gesagt..nichts hinzuzufügen +1

    – Namann

    4. Dezember 2015 um 5:55 Uhr

Benutzer-Avatar
ANjaNA

kannst du definieren power Funktion

int power(int m, int n){
//implement the function body
}

dann wird dein Problem behoben.

Ihr bekommen Fehler, weil es keine Verzögerung für die definierte Funktion gibt. Fügen Sie also die Verzögerung wie oben gezeigt hinzu.

  • Funktionsdeklarationen haben absolut nichts mit Verlinken zu tun. Auch wenn Sie jede Art von Deklarationen weglassen und ohne kompilieren -Werror, und alle Bibliotheken als Linker-Flags bereitstellen, wird es problemlos verknüpft. Deklarationen für Funktionen sind nur eine neue Sache (sie waren vor ansiC nicht vorhanden und wurden nur in c99 obligatorisch, was niemand während der Kompilierung aktiviert), was dem Compiler hilft, vorher etwas Buchhaltung zu machen. Nur Typdeklarationen sind ein Muss.

    – Nachnix

    4. Dezember 2015 um 4:55 Uhr


  • Versuchte das ANjaNA aber kein Erfolg. Als ich jedoch K & R erneut las, sagte es tatsächlich, dass pow (x, y) in der Standardbibliothek enthalten war. Auch das funktionierte nicht sofort, aber das folgende Programm tat es.

    – Hendrik

    4. Dezember 2015 um 5:03 Uhr

  • #include double pow(double m, double n); int main () {doppelt i; for (i=0; i<5; ++i) printf("%.0f %.0f %.0f\n", i, pow(2,i), pow(-3,i)); 0 zurückgeben; }

    – Hendrik

    4. Dezember 2015 um 5:08 Uhr

  • Es sieht nicht richtig aus, aber die Antwort war die Verwendung von Double-Werten anstelle von Int-Werten. Ich weiß nicht genau warum, aber ich bin glücklich (irgendwie)

    – Hendrik

    4. Dezember 2015 um 5:10 Uhr

  • Vielen Dank an alle. Wenn ich auch nur ein Viertel so schlau werde wie Sie, bin ich ein glücklicher Mann. Ja, ich habe den zweiten Teil des Programms ausgelassen, weil er auf der nächsten Seite stand und ich nicht wusste, dass er erforderlich ist. Nun, das tue ich jetzt.

    – Hendrik

    5. Dezember 2015 um 5:30 Uhr

Es gibt eine Standardbibliotheksfunktion, die genau das tut …

#include <math.h>
double pow(double x, double y)

Sie müssen es explizit verlinken, da die default linkerdas ist ld wird aufgerufen, wenn keine anderen Optionen angegeben sind, wird nicht mit der Standard-Mathematikbibliothek verknüpft.

Also musst du es so machen…

gcc file.c -lm

Zuerst erhalten Sie den Fehler, weil der Compiler die Definition der von Ihnen verwendeten Power-Funktion nicht finden kann. Auch wenn du schreibst

int power(int m, int n);

Es liegt ein Fehler vor, weil Sie die Funktion nicht definieren. Am Ende der Definition fehlt {}, und selbst wenn Sie es an das Ende der Definition setzen, erhalten Sie einen Fehler, da Sie für eine int-Funktion nichts zurückgeben. Also, zumindest wenn man eine Funktion definieren will, muss man so vorgehen:

int power(int m, int n){return 0};

Dann können Sie Ihre Funktion power() in der Hauptfunktion verwenden. Aber Sie tun nichts in der Funktion power(), also erhalten Sie nichts zurück, wenn Sie sie aufrufen. Wenn Sie die Potenz einer Zahl berechnen möchten, können Sie die Funktion pow() verwenden, die in der cmath-Bibliothek vorhanden ist. Ein einfacher Weg, dies zu tun, ist etwa so:

#include <stdio.h> // printf
#include <cmath>  // pow()
#include <iostream> //cout

void main()
{
    for (int i = 0; i < 10; i++)
        std::cout << i << " " << pow(2, i) << " " << pow(-3,i) << std::endl;
}

Ich habe den iostream eingefügt, um eine andere Art des Ausdruckens mit dem im std-Namespace definierten Objekt cout zu verwenden. Beachten Sie, dass die Funktion pow() einige Anforderungen an ihre Definition stellt, seien Sie also vorsichtig mit den Typen, die Sie verwenden. Kann man sich anschauen http://www.cplusplus.com/reference/cmath/pow/ für mehr Details.

1346020cookie-checkWarum erhalte ich clang: error: linker command failed with exit code 1?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy