Ergebnis 1 bis 10 von 10

Thema: [C(++)] Linux

  1. #1

    [C(++)] Linux

    Ich wollte letztens mal ein wenig C++-Code unter Linux kompilen. Habe allerdings festgestellt das ich davon keine Ahnung habe .

    Ich habe zwar gpp auf dem System weis aber nicht welches Output-Format Linux braucht...

    unter (ich glaube) man -k gpp hat er nichts gefunden. Unter gpp --help zwar schon, aber da stand nichts darüber...

    Den C-Code selbst habe ich einfach mal in ne .c-Datei (/Home/BG/C-Dateien/Hello.c) gespeichert...

  2. #2
    gcc -o outputfile sourcefiles

    ist wohl die einfachste Variante. Komplizierter wirds mit compiler und linker flags, dafür biete ich dir einfach mein standard-makefile an, bei dem du alle nennenswerten Parameter ändern kannst.

    Code:
    CC=gcc
    # hier dein programmname
    prog=hello
    # deine linker-flags (also die bibliotheken, die du reinlinkst, wie z.b: -lm -lGL ... etc.)
    LFLAGS=
    # deine compiler-flags, also alles, was der compiler schon beim übersetzen
    # beachten soll (-ansi, -O3, etc.)
    CFLAGS =
    # deine quelldateien 
    SFILES = 
    
    all: $(prog)
    
    ${prog}: $(SFILES)
    	$(CC) $(CFLAGS) -o $(prog) $(SFILES) $(LFLAGS)
    
    	
    run:
    	./$(prog)
    	
    clean:
    	rm -f $(prog)
    	rm -f *~
    	rm -f *.o

    Geändert von MuadDib (12.02.2005 um 15:34 Uhr)

  3. #3
    Ich halte das nicht für so schwer. Du rufst den Compiler mit "g++ Dateiname" auf, er erzeugt dann eine Datei namens a.out (den Dateinamen kannst du mit dem Flag "-o Dateiname" ändern). Diese Datei rufst du mit ./a.out auf, dann müsste sie ausgeführt werden. Wenn du das Programm von überall aufrufen willst, musst du es ins Verzeichnis /home/BG/bin kopieren (bzw. mit dem -o Flag direkt dahin kompilieren).

    Das mit dem Output verstehe ich nicht, der Compiler erzeugt automatisch ein Binary.

    Edit:
    Mist, zu langsam.

  4. #4
    Ja, nur bei OS-Dev ruf ich das ganze so auf:
    nasm -f bin -o kernel.bin kernel.asm
    bzw.
    gcc -c Driver\floppy.c -o Compiled\floppy.o

    nur so als Beispiel. _Ich wollte nur wissen was Linux so zum ausführen braucht wie z.B. bei Windows Exe oder bei DOS com...

    Ich werds mal so probieren...

    Danke...

  5. #5
    Zitat Zitat von Crash-Override
    Ich wollte nur wissen was Linux so zum ausführen braucht wie z.B. bei Windows Exe oder bei DOS com...
    Das ist ein weiterer Vorteil von Linux gegenüber Windoof: es erkennt automatisch am Inhalt der Datei, was sie für einen Typ hat. So kann man die Datei nicht durch Änderung des Namens unbrauchbar machen.
    Ein ausführbares Binary ist ein ausführbares Binary, egal wie es heißt. Es braucht keine Endung.

  6. #6
    Äuserst praktisch will ich meinen

    Aber ich habe ja mit meinem Programm eine Terminal-Application. Gibt es nicht irgendein Format das (zumindestens) auf den meisten Linux-Rechnern automatisch im Terminal startet oder gibt es etwas wie die .bat Dateien unter Windows?

    Desweiteren wollte ich fragen ob und wie ich übergabe-parameter auslesen kann.

    Soll heißen so was wie

    ping rpg-ring.com
    das ist das rpg-ring.com ja eine übergabe an das programm. Wie bekomm ich das? Hab bei google seltsammerweise nichts besonderes gefunden nur übergabeparameter von funktionen....

  7. #7
    Zitat Zitat von Crash-Override
    Äuserst praktisch will ich meinen

    Aber ich habe ja mit meinem Programm eine Terminal-Application. Gibt es nicht irgendein Format das (zumindestens) auf den meisten Linux-Rechnern automatisch im Terminal startet oder gibt es etwas wie die .bat Dateien unter Windows?

    Desweiteren wollte ich fragen ob und wie ich übergabe-parameter auslesen kann.

    Soll heißen so was wie

    ping rpg-ring.com
    das ist das rpg-ring.com ja eine übergabe an das programm. Wie bekomm ich das? Hab bei google seltsammerweise nichts besonderes gefunden nur übergabeparameter von funktionen....
    Google mal nach "Shell-Script". Die können sogar deutlich mehr als Batch-Dateien
    Wie meinst du das mit der Übergabe? Bei Shell-Scripten kenne ich mich damit nicht aus.
    Bei C++ musst du die main()-Funktion anders deklarieren:
    int main(int argc, char* argv[])
    in argc steht die Anzahl der Argumente, argv ist ein String- (oder besser gesagt char*-) Array, in dem die Argumente stehen. Das erste Argument ist immer der Name des Programms.

  8. #8
    Zitat Zitat von Crash-Override
    Äuserst praktisch will ich meinen

    Aber ich habe ja mit meinem Programm eine Terminal-Application. Gibt es nicht irgendein Format das (zumindestens) auf den meisten Linux-Rechnern automatisch im Terminal startet oder gibt es etwas wie die .bat Dateien unter Windows?
    Das Linux-Äquivalent zu Windows-Batchdateien sind Shellskripte, die du in einer Reihe von Sprachen schreiben kannst: Die integrierte bash-Skriptsprache, Perl, PHP, Ruby...
    Damit Programme in der Shell laufen mußt du nichts besonderes tun. Einfach schreiben und kompilieren.


    Zitat Zitat
    Desweiteren wollte ich fragen ob und wie ich übergabe-parameter auslesen kann.

    Soll heißen so was wie

    ping rpg-ring.com
    das ist das rpg-ring.com ja eine übergabe an das programm. Wie bekomm ich das? Hab bei google seltsammerweise nichts besonderes gefunden nur übergabeparameter von funktionen....
    Mach dich mal über die Variablen argc und argv schlau (siehe Post über mir). Und am Besten auch über getopt; das ist eine Bibliothek, mit der du Optionen in der Argumentliste standardisiert parsen kannst.

  9. #9
    Hey, Leute ihr habt mir echt geholfen bei meinem 1. C++ Proggy unter Linux

    Deshalb hab ich euch mal mit in den Source geschoben...

    Entstanden ist aus euren Tipps das Programm Calki, das einen Taschenrechner darstellt:

    Man kann es über ./Calki starten, dann fragt es die ganzen Daten (Zahle etc) ab oder man startet es direkt über
    ./Calki -a 10 -b 11 -c * [Für 10 * 11]

    Wenn man es direkt über ./Calki startet fragt es am Ende jeder Berechnung ob eine weitere durchgeführt werden soll. Falls ihr ja sagt, dann wird bei der nächsten Abfrage die Zahl 0 automatisch durch das letzte Ergebis ersetzt.

    So, hier ist der Source:

    Code:
    // Calki 1.0 by B.G.
    // (c) 2005 by Fat Fish Software ··· [B.G.]
    
    #include <iostream.h>
    #include <stdio.h>
    #include <unistd.h>
    
    float Zahl1 = 0;
    float Zahl2 = 0;
    float Ergebnis = 0;
    char art = '+';
    int Fortsetzen(void);
    float last = 0;
    int o = 0;
    
    int main (int argc, char **argv)
    {
      int c;
         
      opterr = 0;
         
      while ((c = getopt (argc, argv, "a:b:c:")) != -1)
        switch (c)
        {
          case 'a':
            sscanf(optarg,"%f",&Zahl1);
            o = 1;
            break;
          case 'b':
            sscanf(optarg,"%f",&Zahl2);
            o = 1;
            break;
          case 'c':
            art = optarg[0];
            o = 1;
            break;
          case '?':
            if (isprint (optopt))
              fprintf (stderr, "Unknown option `-%c'.\n", optopt);
            else
              fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt);
              return 1;
         }
      if (o == 1)
      {
        if (art != '+')
        {
          if (art != '-')
          {
            if (art != '/')
            {
              if (art != 'x')
              {
                cout << "\n\nUngueltiger Operator!\n\n";
                return(0);
              }
            }
          }
        }
         if (art == '+')
        {
          Ergebnis = Zahl1 + Zahl2; 
        }
        if (art == '-')
        {
          Ergebnis = Zahl1 - Zahl2; 
        }
        if (art == 'x')
        {
          Ergebnis = Zahl1 * Zahl2; 
        }
        if (art == '/')
        {
          Ergebnis = Zahl1 / Zahl2; 
        }
        cout << "\n\n" << Zahl1 << " " << art << " " << Zahl2 << " = " << Ergebnis;   
        return(0);
      }
                
    
      cout << "\n\nCalki! 1.0 by B.G.\n";
      cout << "Thx to masterquest, MuadDib and to Jesus_666\n\n";
      do
      {
        cout << "\nGeben Sie einen Operator ein: [+|-|/|x]";
        cin >> art;
        if (art != '+')
        {
          if (art != '-')
          {
            if (art != '/')
            {
              if (art != 'x')
              {
                cout << "\n\nUngueltiger Operator!\n\n";
                return(0);
              }
            }
          }
        }
        cout << "Geben Sie nun die Erste Zahl ein: ";
        cin >> Zahl1;
        cout << "Geben Sie nun die Zweite Zahl ein: ";
        cin >> Zahl2;
    
        if (Zahl1 == 0)
        {
          Zahl1 = last;
          cout << "\nDie 1. Zahl nimmt Wert der letzten Berechnung an (" << last << ")";
        }
        if (Zahl2 == 0)
        {
          Zahl2 = last;
          cout << "\nDie 2. Zahl nimmt Wert der letzten Berechnung an (" << last << ")";
        }
    
        if (art == '+')
        {
          Ergebnis = Zahl1 + Zahl2; 
        }
        if (art == '-')
        {
          Ergebnis = Zahl1 - Zahl2; 
        }
        if (art == 'x')
        {
          Ergebnis = Zahl1 * Zahl2; 
        }
        if (art == '/')
        {
          Ergebnis = Zahl1 / Zahl2; 
        }
        last = Ergebnis;
        cout << "\n\n" << Zahl1 << " " << art << " " << Zahl2 << " = " << Ergebnis;
      }
      while(Fortsetzen()!=0);
      return 0;
    }
    
    int Fortsetzen(void)
    {
      char JaNein = 'j';
    
      cout << "\n\nWeitere Berechnung durchführen?";
      cin >> JaNein;
      if('j' == JaNein)
      {
        return(1);
      }
      if('n' == JaNein)
      {
        return(0);
      }
    }
    Nennt die Source-Datei 'Calki.cpp' und erstellt noch diese makefile (nenn sie 'makefile')

    Code:
    all: Calki
    
    Calki: Calki.cpp
    	g++ Calki.cpp -o Calki
    	
    run: Calki
    	./Calki
    	
    clean:
    	rm -f Calki
    Jetzt wechsle ins Verzeichnis und führe make [run] aus...

    EDIT:
    Es gibt seltsammerweise einen Fehler... wenn man das Prog .\Calki -a 10 -b 10 -c * [also überhaupt mit mal] aufruft rechnet er nicht... kA worans liegt...

    Edit2:
    Habs gelöst... Man muss jetzt aber statt * ein x für mal setzen...
    ./Calki -a 10 -b 10 -c x

    Ausgabe: 10 x 10 = 100

    Edit3:
    Danke, hab die Datei in .cpp umbenannt und die Make angepasst...

    Thx für die Infos

    Geändert von Crash-Override (12.02.2005 um 23:40 Uhr)

  10. #10
    Ein kleiner Hinweis noch: Verwende für C++-Code nicht die Dateiendung .c, sonst könnte man denken, daß es sich um C-Code handelt. Übliche Endungen für C++-Code sind .cpp oder .cxx.

    Und noch was zum Makefile: Du kannst bei den einzelnen Zielen noch Abhängigkeiten vorgeben. Das sind Dateien, die benötigt werden, um ein bestimmtes Ziel bauen zu können. Wenn eine als Abhängigkeit genannte Datei seit dem letzten Aufruf von make verändert wurde wird das entsprechende Ziel neu gebaut.
    Wenn du also für run als Abhängigkeit Calki angibst, dann wird erst das Ziel Calki ausgeführt, befor run durchläuft. Wenn du bei Calki als Abhängigkeit Calki.c angibst, dann wird das Programm nur dann neu gebaut, wenn Calki.c verändert wurde - womit du dir das clean bei all sparen kannst.

    Das Makefile sieht dann so aus:
    Code:
    all: Calki
    
    Calki: Calki.c
    	g++ Calki.c -o Calki
    	
    run: Calki
    	./Calki
    	
    clean:
    	rm -f Calki
    Wenn du jetzt make run eingibst, dann wird erst überprüft, ob die Datei Calki existiert. Wenn sie fehlt oder wenn sie älter ist als Calki.c wird das Programm (neu) kompiliert. Dann wird es ausgeführt.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •