Определение имени исполняемого файла C - PullRequest
30 голосов
/ 17 марта 2009

Когда мы компилируем C-программу, выходные данные сохраняются в a.out. Как мы можем перенаправить скомпилированный вывод в другой файл?

Ответы [ 7 ]

33 голосов
/ 17 марта 2009

Большинство компиляторов C предоставляют для этого опцию -o, например:

gcc -o gentext gentext.c
cc  -o mainprog -Llib -lmymath firstbit.c secondbit.o
xlc -o coredump coredump.c
19 голосов
/ 17 марта 2009

-ofilename составит filename вместо a.out.

8 голосов
/ 17 марта 2009

Согласно инструкции:

-o <file>  Place the output into <file>
4 голосов
/ 17 марта 2009

В Unix, откуда происходит C, программы на C обычно компилируются модуль за модулем, а затем скомпилированные модули связываются в исполняемый файл. Для проекта, состоящего из модулей foo.c и bar.c, команды будут выглядеть так:

cc -c foo.c
cc -c bar.c
cc -o myprog foo.o bar.o

(С -c выходное имя файла становится исходным файлом с суффиксом, замененным на .o.)

Это позволяет вам также перекомпилировать только те модули, которые были изменены, что может значительно сэкономить время для больших программ, но также может стать довольно сложным. (Эта часть обычно автоматизируется с использованием make.)

Для одномодульной программы на самом деле нет смысла сначала компилировать в файл .o, а затем связывать, поэтому достаточно одной команды:

cc -o foo foo.c

Для одномодульных программ принято называть результирующую исполняемую программу так же, как исходный файл C без суффикса .c. Для многомодульных программ не существует жесткой настройки того, будет ли вывод назван в честь файла с основной функцией или нет, так что вы можете изобретать все, что вам нравится.

1 голос
/ 12 декабря 2018

С опцией -o.

gcc main.c -o myCoolExecutable.o

Это нормально, если ваша программа состоит из одного файла. Если у вас есть больше файлов, я предлагаю использовать make: создайте Makefile и затем выполните команду make.

A Makefile - это файл, содержащий некоторые правила для компиляции. Примером может быть следующий (# означает, что строка является комментарием):

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 $@

Вскоре переменная CXX определяет ваш компилятор (gcc, g ++), with CXXFLAGS вы можете определить флаги для вашей компиляции (т.е. -std=c++11). Затем вы можете включить и определить пользовательские (INC_PATH и LIBS: не указано в примере). С помощью SOURCEDIR вы можете указать каталог с исходным кодом (где находятся *.c файлы). Затем SOURCES в основном говорит о том, что все исходные файлы для компиляции - это файлы с расширением *.c.

Makefile содержит набор правил, структура которого следующая:

output: inputs
    commandToExecute

Правило генерации вашего исполняемого файла:

yourExecutableName: $(OBJECTS)
    $(CXX) $(WARNING) $^ -o $@

, что эквивалентно gcc -Wall -Wextra $(OBJECTS) -o yourExecutableName.

$(OBJECTS) - объектный файл, полученный в результате компиляции. Когда указанное выше правило выполняется, если они не найдены, make продолжит сканирование файла, чтобы найти правило для их генерации. В этом случае правило для генерации этих файлов:

$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
    $(CXX) $(WARNING) -MMD -MP -c $< -o $@

Если потребуется дополнительная информация, дайте мне знать.

1 голос
/ 09 августа 2015

Компиляция с использованием:

cc -o <opfilename> <filename.c>

Выполнить, используя:

./<opfilename>
0 голосов
/ 12 декабря 2018

Если foo будет вашим исполняемым файлом, а bar.c - вашим исходным файлом, то команда будет:

gcc -o foo bar.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...