Wie kompiliere und führe ich C / C ++ in einer Unix-Konsole / einem Mac-Terminal aus?

142

Wie kann ich C oder C ++ in einer Unix-Konsole oder einem Mac-Terminal kompilieren / ausführen?

(Ich weiß es, vergesse es und lerne es wieder. Zeit, es aufzuschreiben.)

PA
quelle

Antworten:

187

Wenn es sich um ein einfaches Programm aus einer Hand handelt:

make foo

wo die Quelldatei foo.c oder foo.cpp ist, etc.

Sie brauchen nicht einmal ein Makefile. Make verfügt über genügend integrierte Regeln, um Ihre Quelldatei in eine gleichnamige ausführbare Datei ohne Erweiterung zu integrieren.

Das Ausführen der gerade erstellten ausführbaren Datei entspricht dem Ausführen eines Programms. In den meisten Fällen müssen Sie jedoch den Pfad zur ausführbaren Datei angeben, da die Shell nur nach den darin enthaltenen Dateien sucht $PATH, um ausführbare Dateien zu finden. In den meisten Fällen enthält dies nicht das aktuelle Verzeichnis ( .).

So führen Sie die erstellte ausführbare Datei aus foo:

./foo
camh
quelle
Ich habe die integrierten Regeln, die auf Ziele übertragen wurden, die beim Aufrufen von make angegeben wurden, nicht erkannt.
Habe
"-bash: make: Befehl nicht gefunden" <- Sie müssen das Entwicklertool und die zusätzlichen Komponenten heruntergeladen haben.
Dgig
17
Es ist nicht make main.cpp, aber make main.
Craig McMahon
@CraigMcMahon Danke für deine Eingabe!
Hlawuleka MAS
Etwas Neues gelernt, das ist toll!
FossilizedCarlos
112
gcc main.cpp -o main.out  
./main.out
Andrey Neverov
quelle
31
Als Noob hatte ich so viel Kummer, dass ich das "./" bei der Ausführung nicht berücksichtigt habe
Funk-Shun
2
@ funk-shun Ich wünschte, dein Kommentar wäre das beste Ergebnis beim Googeln - ich habe ewig gebraucht, um das herauszufinden (für meinen Mac) - Danke!
Cory W.
10
Ich habe "gcc main.cpp -o main.out" verwendet und erhalte den Fehler "Undefinierte Symbole für Architektur x86_64:" std :: __ 1 :: locale :: use_facet (std :: __ 1 :: locale :: id &) const " , ... stellt sich heraus, dass der Grund dafür ist, dass gcc default-links libc ist. während der Verwendung von g ++ wird mit libstdc ++ verknüpft. Verwenden Sie also "g ++ main.cpp -o main.out" möglicherweise besser.
Rachel
1
@ Rachel Ich hatte auch das gleiche Problem.
Goldname
1
Über das Undefined symbols for architecture x86_64 Problem ändere ich den Befehl wie folgt: gcc -lstdc++ main.cpp -o main.outund das funktioniert auf meinem Mac. via link: stackoverflow.com/questions/11852568/…
rotoava
69

Dies ist der Befehl, der auf allen Unix-Computern funktioniert ... Ich verwende ihn unter Linux / Ubuntu, aber er funktioniert auch unter OS X. Geben Sie den folgenden Befehl in Terminal.app ein .

$ g++ -o lab21 iterative.cpp

-o ist der Buchstabe O nicht Null

lab21 wird Ihre ausführbare Datei sein

iterative.cpp ist Ihre C ++ - Datei

Nachdem Sie diesen Befehl ausgeführt haben, geben Sie Folgendes in das Terminal ein, um Ihr Programm auszuführen:

$ ./lab21
Komengem
quelle
1
Das hat bei mir funktioniert. Ich habe die anderen oben genannten Lösungen ohne Glück ausprobiert. Vielen Dank!
nmrichards
funktionierte auch für mich, keine Notwendigkeit, etwas zu installieren, perfekte Lösung.
Chander Shakher Ghorela - Guru
33

Zwei Schritte für mich:

zuerst:

make foo

dann:

./foo
Victor Augusto
quelle
1
./fooKeine Ahnung, wie akzeptiert Antwort dieses wichtige Befehlsstück nicht hat
Suhaib
@Suhaib Meine akzeptierte Antwort hatte diesen Befehl nicht, weil die ursprüngliche Frage nicht danach fragte. Es trug den Titel "Ausführen von C / C ++ in einer Unix-Konsole / einem Mac-Terminal" - was ich als "Ausführen des C / C ++ - Compilers" interpretiere. Der Titel wurde anschließend in "kompilieren und ausführen" geändert. Ich habe meine Antwort aktualisiert, um die geänderte Frage widerzuspiegeln.
Camh
15

Die gesamte Ausführung von Anwendungen in einer Unix-Umgebung (Linux, Mac OS X, AIX usw.) hängt vom ausführbaren Suchpfad ab.

Sie können diesen Pfad im Terminal mit folgendem Befehl anzeigen:

echo $ PATH

Unter Mac OS X (standardmäßig) wird der folgende durch Doppelpunkte getrennte Suchpfad angezeigt:

/ usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin

So kann jede ausführbare Datei in den aufgelisteten Verzeichnissen ausgeführt werden, indem nur ihr Name eingegeben wird. Beispielsweise:

cat mytextfile.txt

Dies wird ausgeführt /bin/catund zeigt mytextfile.txt dem Terminal an.

Um einen anderen Befehl auszuführen, der sich nicht im Suchpfad der ausführbaren Datei befindet, müssen Sie den Pfad zur ausführbaren Datei qualifizieren. Angenommen, ich hatte eine ausführbare Datei namens MyProgram in meinem Home-Verzeichnis unter Mac OS XI.

/ Users / oliver / MyProgram

Wenn Sie sich an einem Ort in der Nähe des Programms befinden, das Sie ausführen möchten, können Sie den Namen mit einem Teilpfad versehen. Wenn sich beispielsweise MyProgramdas Verzeichnis /Users/oliver/MyProjectI und ich in meinem Ausgangsverzeichnis befanden, kann ich den Namen der ausführbaren Datei wie folgt qualifizieren und ausführen lassen:

MyProject / MyProgram

Oder sagen Sie, ich war im Verzeichnis /Users/oliver/MyProject2und wollte ausführen. /Users/oliver/MyProject/MyProgramIch kann einen relativen Pfad wie diesen verwenden, um ihn auszuführen:

../MyProject/MyProgram

Ebenso, wenn ich mich im selben Verzeichnis MyProgrambefinde, in dem ich einen relativen Pfad "aktuelles Verzeichnis" verwenden muss. Das aktuelle Verzeichnis, in dem Sie sich befinden, ist das Punktzeichen, gefolgt von einem Schrägstrich. Beispielsweise:

./MeinProgramm

Verwenden Sie den pwdBefehl, um festzustellen, in welchem ​​Verzeichnis Sie sich gerade befinden .

Wenn Sie Programme normalerweise an einem Ort auf Ihrer Festplatte ablegen, den Sie ausführen möchten, ohne deren Namen qualifizieren zu müssen. Wenn Sie beispielsweise ein "bin" -Verzeichnis in Ihrem Home-Verzeichnis für regelmäßig verwendete Shell-Skripte anderer Programme haben, ist es möglicherweise ratsam, Ihren ausführbaren Suchpfad zu ändern.

Dies kann einfach durch Erstellen oder Bearbeiten der vorhandenen .bash_profileDatei in Ihrem Home-Verzeichnis und Hinzufügen der Zeilen erfolgen:

#!/bin/sh
export PATH=$PATH:~/bin

Hier wird das Tilde-Zeichen (~) als Verknüpfung für / Users / oliver verwendet. Beachten Sie auch, dass die Hash-Bang-Zeile (#!) Die erste Zeile der Datei sein muss (falls sie noch nicht vorhanden ist). Beachten Sie auch, dass diese Technik erfordert, dass Ihre Anmeldeshell bash ist (die Standardeinstellung unter Mac OS X und den meisten Linux-Distributionen). Beachten Sie außerdem, dass Sie ~/bindie Exportanweisung wie folgt neu anordnen sollten , wenn Sie möchten, dass Ihre installierten Programme gegenüber ausführbaren Systemdateien bevorzugt verwendet werden:

export PATH=~/bin:$PATH
orj
quelle
Wenn Sie die Kommentare von 'onebyone.livejournal.com' zu meiner eigenen Antwort zur Sicherheit hinzufügen, ist diese Antwort vollständig. Danke dir.
PA
10

Ryan, ich ändere dies, um eine Antwort anstelle eines Kommentars zu sein, da ich anscheinend zu kurz war. Tun Sie dies alles in "Terminal".

Um den G ++ - Compiler zu verwenden, müssen Sie Folgendes tun:

  1. Navigieren Sie zu dem Verzeichnis, in dem Sie die * .cpp-Datei gespeichert haben.

    cd ~/programs/myprograms/
    (Das ~ ist eine Verknüpfung für Ihr Zuhause, dh / Users / Ryan / programme / myprograms /, ersetzen Sie es durch den Ort, den Sie tatsächlich verwendet haben.)

  2. Kompilieren Sie es

    g++ input.cpp -o output.bin (output.bin kann wirklich alles mit jeder Erweiterung sein. bin ist unter Unix nur üblich.)

    Es sollte NICHTS zurückgegeben werden, wenn es erfolgreich war, und das ist in Ordnung . Im Allgemeinen erhalten Sie Rückgaben bei Fehlern.

    Wenn Sie jedoch eingeben ls, wird die Liste der Dateien im selben Verzeichnis angezeigt. Zum Beispiel würden Sie die anderen Ordner input.cpp und output.bin sehen

  3. Führen Sie es nun aus dem Verzeichnis heraus mit aus ./outbut.bin

Nerdwaller
quelle
Danke das hat funktioniert. Würdest du zufällig Tutorials kennen, die diese Dinge erklären würden? Wie genau bedeutet G ++, was ist der 'o'-Schalter und was könnte sonst noch auftauchen?
Ryan
Fügen Sie einen Kommentar zu "Funktioniert makenicht" hinzu, da kein Makefile vorhanden ist.
Ryan, du kannst "man g ++" in das Terminal eingeben, um die "Manpages" zu erhalten (dh Handbücher, die Apple vermutlich eingebettet hat). Ich habe jedoch keine großartigen Tutorials gesehen. Die Manpage zu g ++ kann jedoch mit CFLAGS und allen möglichen erweiterten Kompilierungsoptionen ziemlich ausführlich werden.
Nerdwaller
Nitpick: "Es sollte NICHTS [gedruckt] sein, wenn es erfolgreich war, und das ist in Ordnung. Im Allgemeinen erhalten Sie [Ausgabe] bei Fehlern." Es wird immer einen Rückgabewert geben, 0 bei Erfolg, nicht 0 bei Fehler.
sepp2k
Zusammengeführt von stackoverflow.com/questions/13714436/… (versucht einige grundlegende Anweisungen dafür zu konsolidieren)
Shog9
9

Ein kompakter Weg, dies zu tun, könnte sein:

make foo && ./$_

Schön, einen Einzeiler zu haben, damit Sie Ihre ausführbare Datei einfach wieder ausführen können.

markthethomas
quelle
8

Angenommen, das aktuelle Verzeichnis befindet sich nicht im Pfad, lautet die Syntax ./[name of the program].

Beispielsweise ./a.out

PA
quelle
2
Schön für dich! Der Punkt und der Schrägstrich sind vorhanden, da auf vielen Systemen das aktuelle Verzeichnis ("." In Unix-Begriffen) nicht Teil des von der Shell gesuchten Pfads ist. Wenn Sie es hinzufügen, wird deutlich, welches Programm Sie ausführen möchten.
Entspannen Sie
7

Fügen Sie Folgendes hinzu, um die besten Warnungen zu erhalten. Sie werden es nicht bereuen. Wenn Sie können, kompilieren Sie WISE (Warnung ist Fehler)

- Wall -pedantic -Weffc++ -Werror
Nazgob
quelle
Sollte wirklich die Standardeinstellung sein.
Konrad Rudolph
6

Zum Kompilieren von C- oder C ++ - Programmen gibt es einen allgemeinen Befehl:

  1. make filename

  2. ./filename

make erstellt Ihre Quelldatei in eine ausführbare Datei mit demselben Namen. Wenn Sie jedoch die Standardmethode verwenden möchten, können Sie den gcc-Compiler verwenden, um C-Programme und g ++ für c ++ zu erstellen

Für C:

gcc filename.c

./a.out

Für C ++:

g++ filename.cpp

./a.out
Yogesh Nogia
quelle
2

Verwenden Sie a makefile. Selbst für sehr kleine Projekte (= eine Datei) lohnt sich der Aufwand wahrscheinlich, da Sie mehrere Sätze von Compilereinstellungen zum Testen haben können. Das Debuggen und Bereitstellen funktioniert auf diese Weise viel einfacher.

Lesen Sie das makeHandbuch , es scheint auf den ersten Blick ziemlich lang zu sein, aber die meisten Abschnitte können Sie einfach überfliegen. Alles in allem habe ich ein paar Stunden gebraucht und mich viel produktiver gemacht.

Konrad Rudolph
quelle
Danke, das ist auch eine gute Antwort. Ich versuche wirklich, make so matschig wie möglich zu verwenden, und das ist auch ein Grund, warum ich die Syntax des "einfachen" Weges vergessen habe.
PA
2

Geben Sie einfach das Verzeichnis ein, in dem sich Ihre c / cpp-Datei befindet.

zum Kompilieren und Ausführen von c-Code.

$gcc filename.c
$./a.out filename.c

zum Kompilieren und Ausführen von C ++ - Code.

$g++ filename.cpp
$./a.out filename.cpp

"$" ist das Standard-Mac-Terminal-Symbol

Shiv Prakash
quelle
2

Um einen CPP-Quellcode vom Mac-Terminal zu kompilieren und auszuführen, muss Folgendes ausgeführt werden:

  1. Wenn der Pfad der CPP-Datei somePath / fileName.cpp lautet, gehen Sie zuerst in das Verzeichnis mit dem Pfad somePath
  2. Geben Sie zum Kompilieren von fileName.cpp c ++ fileName.cpp -o fileName ein
  3. Geben Sie zum Ausführen des Programms ./fileName ein
Alper Gur
quelle
0

Das Ausführen einer .C-Datei über das Terminal erfolgt in zwei Schritten. Der erste Schritt besteht darin, gcc in das Terminal einzugeben, die C-Datei auf dem Terminal abzulegen und dann zu drücken Enter:

username$ gcc /Desktop/test.c 

Führen Sie im zweiten Schritt den folgenden Befehl aus:

username$ ~/a.out
Himanshu Mahajan
quelle
0

Angenommen, der Dateiname lautet "main.cpp", um C ++ - Dateien auszuführen, die unter dem Befehl ausgeführt werden.

1.Kompilieren Sie, um eine Objektdatei aus einer C ++ - Datei zu erstellen.

g++ -c main.cpp -o main.o

2. Da #include <conio.h>MacOS nicht unterstützt wird, sollten wir die Alternative verwenden, die Mac unterstützt #include <curses.h>. Jetzt muss die Objektdatei in eine ausführbare Datei konvertiert werden. Um zu benutzen, müssen curses.hwir die Bibliothek benutzen -lcurses.

g++ -o main main.o -lcurses

3. Führen Sie jetzt die ausführbare Datei aus.

./main
Teena nath Paul
quelle