Wenn wir ein C-Programm kompilieren, wird die Ausgabe in a.out gespeichert. Wie können wir die kompilierte Ausgabe in eine andere Datei umleiten?
Bestimmen des Namens der ausführbaren C-Datei
paxdiablo
Die meisten C-Compiler bieten dafür eine Option, wie z -o
Option für gcc
und einige andere:
gcc -o gentext gentext.c
cc -o mainprog -Llib -lmymath firstbit.c secondbit.o
xlc -o coredump coredump.c
-ofilename
wird machen filename
Anstatt von a.out
.
Arkaitz Jimenez
Laut Handbuch:
-o <file> Place the output into <file>
In Unix, wo C seinen Ursprung hat, werden C-Programme normalerweise Modul für Modul kompiliert, und dann werden die kompilierten Module zu einer ausführbaren Datei gelinkt. Für ein Projekt, das aus Modulen besteht foo.c
und bar.c
die Befehle wären wie folgt:
cc -c foo.c
cc -c bar.c
cc -o myprog foo.o bar.o
(Mit -c wird der Ausgabedateiname zur Quelldatei, wobei das Suffix durch .o ersetzt wird.)
Dadurch können Sie auch nur die geänderten Module neu kompilieren, was bei großen Programmen eine große Zeitersparnis sein kann, aber auch ziemlich knifflig werden kann. (Dieser Teil wird normalerweise mithilfe von automatisiert make
.)
Für ein Einzelmodul-Programm macht es keinen Sinn, zuerst in eine .o-Datei zu kompilieren und dann zu linken, also genügt ein einziger Befehl:
cc -o foo foo.c
Bei Einzelmodulprogrammen ist es üblich, das resultierende ausführbare Programm genauso wie die C-Quelldatei ohne das Suffix .c zu nennen. Bei Programmen mit mehreren Modulen gibt es keine feste Vorgabe, ob die Ausgabe nach der Datei mit der Hauptfunktion benannt wird oder nicht, also können Sie frei erfinden, was Ihnen gefällt.
Mit dem -o
Möglichkeit.
gcc main.c -o myCoolExecutable.o
Dies ist in Ordnung, wenn Ihr Programm aus einer einzigen Datei besteht. Wenn Sie mehr Dateien haben, empfehle ich die Verwendung make
: ein … kreieren Makefile
und führen Sie dann den Befehl aus make
.
EIN Makefile
ist eine Datei, die einige Regeln für die Kompilierung enthält. Ein Beispiel kann das folgende sein (#
bedeutet, dass die Zeile ein Kommentar ist):
CXX = gcc
#CXXFLAGS = -std=c++11
#INC_PATH = ...
#LIBS = ...
SOURCEDIR := yourSourceFolder
SOURCES := $(wildcard $(SOURCEDIR)/*.c)
OBJDIR=$(SOURCEDIR)/obj
OBJECTS := $(patsubst $(SOURCEDIR)/%.c,$(OBJDIR)/%.o, $(SOURCES))
DEPENDS := $(patsubst $(SOURCEDIR)/%.c,$(OBJDIR)/%.d, $(SOURCES))
# ADD MORE WARNINGS!
WARNING := -Wall -Wextra
# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean
# The first rule is the default, ie. "make",
# "make all" and "make parking" mean the same
all: yourExecutableName
clean:
$(RM) $(OBJECTS) $(DEPENDS) yourExecutableName
# Linking the executable from the object files
# $^ # "src.c src.h" (all prerequisites)
yourExecutableName: $(OBJECTS)
$(CXX) $(WARNING) $^ -o $@
#$(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) $^ -o $@ $(LIBS)
-include $(DEPENDS)
$(OBJDIR):
mkdir -p $(OBJDIR)
$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
$(CXX) $(WARNING) -MMD -MP -c $< -o $@
In Kürze CXX
Variable definiert Ihren Compiler (gcc, g++), with CXXFLAGS
Sie können Flags für Ihre Zusammenstellung definieren (dh -std=c++11
). Dann können Sie benutzerdefinierte (INC_PATH
und LIBS
: im Beispiel nicht gesetzt). Mit SOURCEDIR
Sie können Ihr Quellcodeverzeichnis angeben (wobei *.c
Dateien sind).Dann SOURCES
sagt im Grunde, dass die Quelldateien für die Kompilierung alle Dateien mit Erweiterung sind *.c
.
Das Makefile
enthält ein Regelwerk, dessen Struktur wie folgt ist:
output: inputs
commandToExecute
Die Regel zum Generieren Ihrer ausführbaren Datei lautet
yourExecutableName: $(OBJECTS)
$(CXX) $(WARNING) $^ -o $@
was äquivalent ist gcc -Wall -Wextra $(OBJECTS) -o yourExecutableName
.
$(OBJECTS)
sind die aus der Kompilierung resultierende Objektdatei. Wenn die obige Regel ausgeführt wird und sie nicht gefunden werden, scannt make die Datei weiter, um eine Regel zu finden, um sie zu generieren. In diesem Fall lautet die Regel zum Generieren dieser Dateien:
$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
$(CXX) $(WARNING) -MMD -MP -c $< -o $@
Wenn weitere Informationen benötigt werden, lassen Sie es mich wissen.
-
Beste Antwort bei weitem,
make
ist der Weg zu gehen.– klingeln
11. Januar 2021 um 20:16 Uhr
Francesco Boi
Wenn foo
wird Ihre ausführbare Datei sein und bar.c
Ihre Quelldatei ist, lautet der Befehl:
gcc -o foo bar.c
-
Beste Antwort bei weitem,
make
ist der Weg zu gehen.– klingeln
11. Januar 2021 um 20:16 Uhr
KJ Sudarshan
Kompilieren mit:
cc -o <opfilename> <filename.c>
Ausführen mit:
./<opfilename>
gcc source.c -o Name
– EsmaeelE
14. Juni 2017 um 2:13 Uhr