59

当我们编译 C 程序时,输出存储在 a.out 中。我们如何将编译后的输出重定向到另一个文件?

4

9 回答 9

50

大多数 C 编译器-o为此提供了选项,例如:

gcc -o gentext gentext.c
cc  -o mainprog -Llib -lmymath firstbit.c secondbit.o
xlc -o coredump coredump.c
于 2009-03-17T11:27:41.877 回答
24

-ofilenamefilename代替a.out.

于 2009-03-17T11:20:21.693 回答
13

根据手册:

-o <file>  Place the output into <file>
于 2009-03-17T11:22:11.953 回答
9

在 C 语言起源的 Unix 中,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 源文件相同的程序。对于多模块程序,输出是否以具有 main 函数的文件命名并没有硬性规定,因此您可以自由地发明任何您喜欢的东西。

于 2009-03-17T11:31:00.903 回答
6

-o选项。

gcc main.c -o myCoolExecutable.o

如果您的程序由单个文件组成,这没关系。如果您有更多文件,我建议您使用make:创建一个Makefile然后运行该命令make

AMakefile是一个包含一些编译规则的文件。示例如下(#表示该行是注释):

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_PATHLIBS:示例中未设置)。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 $@

如果需要更多信息,请告诉我。

于 2018-12-12T11:01:21.907 回答
4

如果foo将是您的可执行文件并且bar.c是您的源文件,那么命令是:

gcc -o foo bar.c
于 2018-12-12T10:09:39.817 回答
1

编译使用:

cc -o <opfilename> <filename.c>

执行使用:

./<opfilename>
于 2015-08-09T08:20:31.013 回答
0

C语言中根据用户选择给出.exe文件名的格式

第 1 步:-在终端上以以下格式运行 gcc(或您拥有的编译器)

    gcc -o put_your_name_you_want_to_give (space) your_file_name_you_want_to_execute

注意:- 如果您正在运行“Vs Code”,请使用“Tab”键自动完成。

第 2 步:-以格式记下程序的名称

           .\the_name_you_have_given.exe

你完成了!

于 2020-12-25T10:25:31.800 回答
0

假设你在 ubuntu

第 1 步:使用这些命令运行 gcc 进行编译filename.c

gcc filename.c -o filename.out

  • filename.out将被创建,(它可能会或可能不会显示其他文件的存储位置)

步骤 2:执行filename.outby

./filename.out

第三步:等待输出

就是这样,你完成了

于 2021-05-03T08:16:12.160 回答