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.
stattgcc 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
ini*i <= n