# Warum kann ich dieses C Programm nicht unter Linux kompilieren?



## shutdown (24. Januar 2005)

Hi!

Der Titel sagts ja eigentlich schon.

Ich bekomme folgendes C-Programm einfach nicht zu laufen.

Er bringt mir diese Fehlermeldung



> tmp/ccVFXBXa.o(.text+0x111): In function `main':
> : undefined reference to `sqrt'
> /tmp/ccVFXBXa.o(.text+0x1c5): In function `main':
> : undefined reference to `fmod'
> ...



Also auf gut deutsch: Er akzeptiert keine Funktion der math.h
Diese ist aber richtig installiert! (Auch bei Freunden klappt die Kompilierung einfach nicht).
(Unter Windows klappt die Kompilierung und das Programm einwandfrei!)

Vielen Dank für eure Hilfe!

cu shutdown


Hier nun das Programm:


```
/***************************************************************************** 
program:    prim_mit_datei.c 
            Primzahl-Test (in der Art nach Erestostrates) mit Datei-Anbindung 
author:      shutdown 
created:    14-01-2005 
modified:   15-01-2005 
compiler:   BC++ 5.02 
*****************************************************************************/ 

#include '<'stdio.h> 
#include '<'string.h>     // die '' nur fürs "dumme" Forum ;-)
#include '<'fcntl.h> 
#include '<'math.h> 
#include '<'stdlib.h> 
#include '<'conio.h> 

long double string_to_number(char string[]); 

void main(void) 
{ 
    char string[1000]; 
    long double i; 
    long double testzahl; 
    int status = 1; 
    char string_dat[1000]; 


    long double von, bis; 

    long double wurzel; 

    FILE *datei; 

    printf("***Primzahltest mit Dateianbindung***\n\n"); 

    printf("Start bei: "); 
    scanf("%Lf", &von); 

    printf("Ende bei: "); 
    scanf("%Lf", &bis); 

    for(i=von; i<=bis; i++)// while(1) 
    { 
    status = 1;   // grundsätzlich geht man davon aus, dass es eine Primzahl ist 
                   // ein Gegenbeispiel (*0) und Status ist 0 und damit nicht prim 

    testzahl = i; 

    wurzel = sqrt(testzahl);    // Es ist nur eine Überprüfung bis zur Wurzel nötig 

   // printf("Testzahl eingeben (ENDE mit 0): "); 
   // scanf("%f",&testzahl); 

    if(testzahl == 0) 
        break; 

    datei = fopen("prim.txt", "a+"); 

    while(fgets(string, sizeof(string), datei) && (string_to_number(string) <= wurzel)) 
    { 
        if(fmod(testzahl, 2) != 0) 
        { 
           if(!(fmod(testzahl, string_to_number(string))== 0.0)) 
           { 
               status *= 1;                           //ist Primzahl 
           } 
           else 
           { 
               status *= 0;                        //keine Primzahl 
               break; 
           } 
           if(testzahl == string_to_number(string)) 
               status = 1; 
        } 
        else 
        { 
            status = 0; 
            break; 
        } 
    } 

    fclose(datei);                       // fragt mich nicht warum´... 
    datei = fopen("prim.txt", "a+");     // ... aber es hilft wunder! 


    if(status == 1) 
    { 
    //    printf("\n%.0Lf ist eine Primzahl!\n", testzahl); 

        fprintf(datei, "%.0Lf\n", testzahl);     //größerer Bereich als ultoa 

        //ultoa(testzahl, string_dat, 10);       //Umwandlung unsigned long to string 

        //if(fputs(string_dat, datei)==EOF) 
        //    printf("Fehler\n");                   //Wenn Primzahl, dann in Datei 
        //fputs("\n", datei);                        //schreiben 
    } 
    else 
    { 
    // printf("\n%.0Lf\n", testzahl); 
    } 

    fclose(datei); 


    }            //ENDE while-Schleife 

    printf("Fertig!"); 
} 

long double string_to_number(char string[])  // die macht dasselbe wie atoi() 
{                                      // aber komm erstmal auf den Namen atoi! 
    int laenge; 
    long double zahl=0; 
    int i, j=0; 
    int help; 

    i = strlen(string); 


    j = 0; 
    i -= 2; 

    while(i>=0) 
    { 
        if(i<0)         // wenn string[0] überschritten (i--), dann ENDE 
            break; 
        switch(string[i]) 
        { 
             case '1': help = 1; 
                        break; 
             case '2': help = 2; 
                       break; 
             case '3': help = 3; 
                        break; 
             case '4': help = 4; 
                        break; 
             case '5': help = 5; 
                        break; 
             case '6': help = 6; 
                        break; 
             case '7': help = 7; 
                        break; 
             case '8': help = 8; 
                        break; 
             case '9': help = 9; 
                        break; 
             case '0': help = 0; 
                         break; 
        } 

        zahl += help * pow(10, j);   //erst die Einer addieren, dann die Zehner... 

    i--; 
    j++; 
    } 

    return zahl; 

}
```


----------



## JohannesR (24. Januar 2005)

Du musst das Programm mit dem Parameter -lm uebersetzen, dann geht es. "lm" stellt die libmath zur verfuegung.


----------



## RedWing (24. Januar 2005)

Hallo,

verusch mal die libm beim kompilieren mit dazu zu linken:


```
gcc -lm your_source.c
```

Gruß

RedWing


----------



## RedWing (24. Januar 2005)

Ups, da war wohl jemand schneller


----------



## shutdown (24. Januar 2005)

super, genau das wars!

Vielen Dank!

Kennt zufällig jemand noch den Befehl, mit dem man Textdateien in ein Linuxfreundliches Format verwandeln kann (ich weiß, dass es einen gibt, ich komm jetzt einfach net drauf)

Meine unter Windows erstellte Datei sieht so aus:

2^M
3^M
4^M
...

Nur kann ich diese ^M nicht wirklich ansprechen/löschen.

Sie werden aber von Linux auf irgendeine Art und Weise interpretiert, denn wenn ich die Datei zeilenweise einlese, dann akzeptiert er diese "Eingaben" nicht.

Lass ich mein Programm die Datei erzeugen, dann steht da aber nix von ^M

(wäre ganz praktisch, es sin nämlich schon fast 2 Mio Einträge ;-) )

Danke!

shutdown


----------



## imweasel (24. Januar 2005)

Hi,

versuch es mal mit *dos2unix*. Das sollte aus deinem ^M eine _ordenliches_ newlinechar machen.


----------



## JohannesR (24. Januar 2005)

Unter Windows ist das "^M" = CR & LF, Unix nutzt nur ein LF. Mit dem Vim koenntest du wahrscheinlich auch per 
	
	
	



```
:1,$s/\\r\\n/\\n/g
```
 alles umwandeln. Vim-VIM-VIM


----------



## shutdown (24. Januar 2005)

Danke!
Jetzt klappts genau so wie ichs gern hätt  *freu*

Und es is tatsächlich schneller als unter Windows ;-)

Vielen Dank!

cu shutdown


----------



## Daniel Toplak (24. Januar 2005)

Kleiner Tipp am Rande entweder du nutzt std::string::getline zum einlesen oder du musst die Zeilen entsprechen verarbeiten, somit bleibt deine Datendatei portabel.

Daniel


----------

