Bestimmen des Namens der ausführbaren C-Datei

Lesezeit: 4 Minuten

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?

  • gcc source.c -o Name

    – EsmaeelE

    14. Juni 2017 um 2:13 Uhr

Benutzeravatar von paxdiablo
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.

Benutzeravatar von Arkaitz Jimenez
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.cdie 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

Benutzeravatar von Francesco Boi
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

Benutzeravatar von KJ Sudarshan
KJ Sudarshan

Kompilieren mit:

cc -o <opfilename> <filename.c>

Ausführen mit:

./<opfilename>

1414880cookie-checkBestimmen des Namens der ausführbaren C-Datei

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy