undefined reference to 'sqrt'



  • Hallo.

    Ich habe ein Programm geschrieben, das mir die Summe aller Divisoren liefert.
    Zuerst kam die Fehlermeldung trotz eingebundenem Header <math.h>

    /tmp/ccjjn8oj.o: In function `main':
    divsum.c:(.text+0x41): undefined reference to `sum_div'
    collect2: Fehler: ld gab 1 als Ende-Status zurück
    

    Laut google musste ich dann beim kompilieren noch das Flag "lm" mitgeben.
    statt

    gcc divsum.c -o divsum
    
    gcc divsum.c -o divsum -lm
    

    Nun läuft das Programm.
    Das Programm will ich aber auf die Seite hochladen: http://www.spoj.com
    Dort bekomme ich einen kompilierfehler.
    Nun meine Frage: Warum muss ich das "lm" anhängen? Gibts keine andere Lösung, ohne ein zusätzliches Flag?

    Hier noch der Code:

    #include <stdio.h>
    #include <math.h>
    
    int sum_of_div( int n );
    
    int main(void)
    {
      int loop;
      int number;
      scanf( "%d", &loop ); 
      while( loop-- )
        {
          scanf( "%d", &number );
          printf( "%d\n", sum_of_div( number ) );
        }
      return 0;
    }
    
    int sum_of_div( int n ) 
    {
      int sum = 1;
      int i;
      int end;
      end = sqrt( n );
    
      for( i = 2; i <= end; i++ )   
        if( n%i == 0 )  
          sum += ( i + n/i ); 
    
      if( ( end*end ) == n )    
        sum -= end;  
    
      return sum;
    }
    


  • Sende es als C++ ein, da wird lm dazugelinkt.



  • Das -lm bindet die Fließkommabibliothek ( libm ) mit zu deinem Programm.

    undefined reference to 'sqrt' ist auch ein Meldung vom Linker und nicht vom Compiler.

    Wie lautet denn die Fehlermeldung von spoj.com?

    Du kannst deine Schleifenbedingung ändern von i <= end in i*i <= n


Anmelden zum Antworten