Waarom krijg ik clang: error: linkeropdracht mislukt met exitcode 1?

Ik ben een nieuweling die zich langzaam een weg baant door K&R met behulp van Xcode. In de sectie Functies heb ik de code voor hun voorbeeld van de power-functie als volgt ingevoerd.

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

Als ik het probeer uit te voeren, verschijnt de volgende foutmelding:

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)

Ik heb veel van de antwoorden op deze vraag gelezen, maar kan niet zien hoe dit van toepassing is op mijn situatie met zo’n klein programma.
Zou dankbaar zijn voor alle hulp.


Antwoord 1, autoriteit 100%

Waarom krijg ik clang: error: linkeropdracht mislukt met afsluitcode 1?

Je hebt zojuist de functie gedeclareerd. Er is geen definitie in code. Op het moment van het koppelingsproces kan compiler (hier clang) de functie powerniet koppelen aan zijn definitie, dus de linker gooit de fout in dit soort situaties. Als u

. definieert

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

Vervolgens kan linker uw declaratie van de functie poweraan zijn definitie koppelen, u krijgt geen foutmelding.

Voor geheel getal heb ik een functie voor je gemaakt.

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

Compileer dit met gcc file.c

Ik hoop dat u de functie begrijpt. Veel geluk: -)


Antwoord 2, Autoriteit 38%

U miste de definitie van functie int power (int base,int n)die wordt gegeven nadat uw belangrijkste eindigt op de volgende pagina van het boek.

Wanneer u het prototype van een functie declareert, moet u definiëren wat het moet doen, heeft u net de stroomfunctie uitgesproken en nooit gedefinieerd, dat is waarom u een foutmelding hebt.

Voeg de volgende definitie toe, uw code zal compileren zoals u wilt dat het is.

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

Antwoord antwoord
Nu is dit niet relevant, maar usefull

Ik denk dat u de functie pow()wilt gebruiken die is gedefinieerd in math.h.

double pow(double a, double b)

De C-bibliotheekfunctie pow(double a, double b)Retourneert aOpgehaald naar de kracht van b. Deze functie retourneert een dubbele waarde dus om te afdrukken dat correcte specificator "%lf"is.

In dit geval hoeft u alleen kopbestand op te nemen

#include<math.h>

in uw programma.

Het is niet nodig om functieverklaring te geven int power(int m, int n);

De fout die u ondervindt is te wijten aan het geven van I als een van de parameter aan pow()
want wanneer u uw code compileert (na het opnemen van math.hen het gebruik van pow()door ite vervangen door gehele getallen, wordt uw code gecompileerd en zal de juiste output geven.

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

Dit geeft je het juiste resultaat, maar als je het compileert met

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

Het geeft dezelfde fout, dus ik denk dat pow()alleen constantenals invoer nodig heeft, zodat het niet in de for-lus wordt uitgevoerd.

En als u math.hniet wilt opnemen, kunt u eenvoudig declareren

extern double pow (double base, double exponent); 

Dat zal correct linken met de bibliotheekcode zonder het math.hinclude-bestand te gebruiken, hier is een voorbeeld.

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

Voor meer informatie over pow()kun je de man-pagina op Linux bekijken, bijv. man pow.


Antwoord 3, autoriteit 12%

u kunt de functie powerdefiniëren

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

dan wordt je probleem opgelost.

U krijgt een foutmelding, omdat er geen vertraging is voor de gedefinieerde functie. Dus voeg de vertraging toe zoals hierboven weergegeven.


Antwoord 4, autoriteit 12%

Er is een standaard bibliotheekfunctie die precies dat doet…

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

Je moet het expliciet linken omdat de standaard linker, dat is lddie wordt aangeroepen als er geen andere opties worden gegeven, niet linkt met de standaard wiskundebibliotheek.

Dus je moet het doen als…

gcc file.c -lm


Antwoord 5

Eerst krijg je de foutmelding omdat de compiler de definitie van de power-functie die je gebruikt niet kan vinden. Zelfs als je schrijft

int power(int m, int n);

Er is een fout opgetreden omdat u de functie niet definieert. Er ontbreekt {} aan het einde van de definitie en zelfs als u het aan het einde van de definitie plaatst, krijgt u een foutmelding omdat u niets teruggeeft voor een int-functie. Dus als je een functie wilt definiëren, moet je als volgt te werk gaan:

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

Dan kunt u uw functie power() gebruiken in de hoofdfunctie. Maar je doet niets in de power() functie, dus je krijgt er niets voor terug om het aan te roepen. Als je de macht van een getal wilt berekenen, kun je de functie pow() gebruiken die aanwezig is in de cmath-bibliotheek. Een eenvoudige manier om dit te doen is ongeveer als volgt:

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

Ik heb de iostream toegevoegd om een andere manier van afdrukken te gebruiken met het object cout gedefinieerd in de std-naamruimte. Merk op dat de functie pow() enkele vereisten heeft voor zijn definitie, dus wees voorzichtig met de typen die u gebruikt. U kunt een kijkje nemen op http://www.cplusplus.com/reference/cmath/pow/ voor meer details.

Other episodes