C Programm ausführen



  • Hi,
    ich fange gerade mit C an... und scheitere bereits bei dem einfachsten HelloWorld Programm.

    ich hab zunächst meine helloworld.c erstellt:

    /* helloworld.c */
    #include <stdio.h>
    
    int main (void) {
     printf("Hallo Welt\n");
     return 0;
    }
    

    Nun habe ich zunächst das ganze über die Bash kompiliert mit:

    gcc -c helloworld.c
    

    Es wird eine Datei helloworld.o angelegt. Wenn ich diese nun aber mit

    ./helloworld.o
    

    ausführen möchte bekomme ich folgende Meldung:

    bash: ./helloworld.o: cannot execute binary file
    

    ich hoffe ihr könnt mir helfen



  • Tipp mal das ein:

    gcc hw.c -o hw.exe
    


  • Mit gcc -c erzeugst du nur ein Objekt-File, kein ausführbare Binary. Du musst dann dieses Objekt-File zu einer ausführbare Binary linken. Oder du machst alles in einem Schritt:

    $ gcc helloworld.c -o helloworld
    $ ./helloworld
    


  • wenn ich das Programm mit diesem bash kompilier, passiert was? es erzeugt eine binary datei und speichert mir diese in den gleichen ordner, wo das Programm liegt? wenn ja.. das ist bei mir nämlich leider nicht der fall.. 😕 ich soll ein ähnliches Programm samt binary datei als aufgabe abgeben.. aber wie komm ich zu dieser datei???



  • Führe im entsprechenden Verzeichnis aus:

    $ make helloworld && echo OK
    

    Falls "OK" erscheint, wurde das Programm korrekt erstellt und du kannst es ausführen mit

    $ ./helloworld
    

    und auch so abgeben.
    Die .o Datei ist wie gesagt das Objekt-File, eine Art Zwischenstand und nicht ausführbar.



  • MichiH0112 schrieb:

    wenn ich das Programm mit diesem bash kompilier, passiert was? es erzeugt eine binary datei und speichert mir diese in den gleichen ordner, wo das Programm liegt? wenn ja.. das ist bei mir nämlich leider nicht der fall.. 😕 ich soll ein ähnliches Programm samt binary datei als aufgabe abgeben.. aber wie komm ich zu dieser datei???

    Wie rufst du denn den Compiler genau auf? Mit gcc foo.c -o foo erzeugt er dir ein Binary mit dem Namen foo in dem aktuellen Ordner. Außer natürlich er findet Fehler in foo.c. Dann meldet er die Fehler aber.

    Kurz und knapp: Versuch dein Problem besser zu beschreiben und hänge deine Fragen bitte nicht einfach an andere Themen an!
    http://www.tty1.net/smart-questions_de.html#before



  • Wutz schrieb:

    Führe im entsprechenden Verzeichnis aus:

    $ make helloworld && echo OK
    
    $ make helloworld && echo OK
    make: *** Keine Regel, um »helloworld« zu erstellen.  Schluss.
    

    Hmm, was mach ich nun?
    🙂



  • Im aktuellen Verzeichnis muss auch helloworld.c vorhanden sein, falls make immer noch fehlschlägt, dann ist deine Standard C Entwicklungsconsolenumgebung Schrott und du solltest die anderen Beispiele durcharbeiten.



  • Wutz schrieb:

    Im aktuellen Verzeichnis muss auch helloworld.c vorhanden sein, falls make immer noch fehlschlägt, dann ist deine Standard C Entwicklungsconsolenumgebung Schrott und du solltest die anderen Beispiele durcharbeiten.

    Huh, da hast du recht.
    🙂



  • Naja wieso erwartest du denn dass in jedem Ordner ein Makefile liegen muss?

    gcc hello_world.c -o hello_world

    Das kompiliert hello_world.c und erzeugt die ausführbare Datei hello_world. Die kannst du dann mit ./hello_world aufrufen

    Wenn du den -o Paramterer weglässt ist dein Programm in der Datei a.out (für assembler-output)



  • linux_c89 schrieb:

    Naja wieso erwartest du denn dass in jedem Ordner ein Makefile liegen muss?

    Das war auch mein Gedanke, aber dann hat die Nachforschung ergeben, dass alle ordentlichen make-Varianten eine (mehr oder weniger) sinnvolle Voreinstellung für .c-Dateien haben.
    🙂



  • Implicit Rules heißen die 🙂



  • Ich dachte aber zumindest so ein makefile müsste man haben

    CC = gcc
    CFLAGS = -g -c
    LD =gcc
    LDFLAGS= -o hello_world
    all: hello_world.o
            $(LD) $(LDFLAGS) hello_world.o
    

    Die implicit rules dachte ich wären dann dass er automatisch erkennt wie er hello_world.o aus hello_world.c gewinnt



  • linux_c89 schrieb:

    Die implicit rules dachte ich wären dann dass er automatisch erkennt wie er hello_world.o aus hello_world.c gewinnt

    Zumindest GNU make macht auch exe's. Aus rüdis Link:

    n is made automatically from n.o by running the linker (usually called ld) via the C compiler. The precise recipe used is ‘$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)’.

    🙂


Log in to reply