Подтвердить что ты не робот

Определение имени исполняемого файла C

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

4b9b3361

Ответ 1

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

gcc -o gentext gentext.c
cc  -o mainprog -Llib -lmymath firstbit.c secondbit.o
xlc -o coredump coredump.c

Ответ 2

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

Ответ 3

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

-o <file>  Place the output into <file>

Ответ 4

В 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. Для многомодульных программ нет жесткого пользовательского интерфейса, независимо от того, вызывается ли имя после файла с главной функцией или нет, поэтому вы можете изобретать все, что поражает ваше воображение.

Ответ 5

Скомпилировать, используя:

cc -o <opfilename> <filename.c>

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

./<opfilename>

Ответ 6

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

gcc -o foo bar.c

Ответ 7

С -o.

gcc main.c -o myCoolExecutable.o

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

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 [email protected]
    #$(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) $^ -o [email protected] $(LIBS)

-include $(DEPENDS)

$(OBJDIR):
    mkdir -p $(OBJDIR)

$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
    $(CXX) $(WARNING) -MMD -MP -c $< -o [email protected]

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

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

output: inputs
    commandToExecute

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

yourExecutableName: $(OBJECTS)
    $(CXX) $(WARNING) $^ -o [email protected]

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

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

$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
    $(CXX) $(WARNING) -MMD -MP -c $< -o [email protected]

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