确定C可执行文件名称

37 c executable gcc compilation linkage

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

pax*_*blo 34

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

gcc -o gentext gentext.c
cc  -o mainprog -Llib -lmymath firstbit.c secondbit.o
xlc -o coredump coredump.c
Run Code Online (Sandbox Code Playgroud)


Dan*_*ite 19

-ofilenamefilename代替a.out.


Ark*_*nez 10

根据手册:

-o <file>  Place the output into <file>
Run Code Online (Sandbox Code Playgroud)


小智 8

在 C 起源的 Unix 中,C 程序通常是一个模块一个模块地编译,然后编译的模块被链接成一个可执行文件。对于由模块foo.c和组成的项目,bar.c命令如下:

cc -c foo.c
cc -c bar.c
cc -o myprog foo.o bar.o
Run Code Online (Sandbox Code Playgroud)

(使用 -c,输出文件名成为后缀替换为 .o 的源文件。)

这还允许您仅重新编译那些已更改的模块,这对于大型程序来说可以节省大量时间,但也可能变得非常棘手。(这部分通常使用 自动化make。)

对于单模块程序,首先编译为 .o 文件然后链接实际上没有任何意义,因此单个命令就足够了:

cc -o foo foo.c
Run Code Online (Sandbox Code Playgroud)

对于单模块程序,习惯上将生成的可执行程序与 C 源文件一样调用,不带 .c 后缀。对于多模块程序,对于输出是否以带有 main 函数的文件命名没有硬性规定,因此您可以随意发明任何您喜欢的东西。


Fra*_*Boi 5

随着-o选项。

gcc main.c -o myCoolExecutable.o
Run Code Online (Sandbox Code Playgroud)

如果您的程序由单个文件组成,这没问题。如果您有更多文件,我建议使用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 $@
Run Code Online (Sandbox Code Playgroud)

不久CXX变量定义了您的编译器(gcc、g++),with CXXFLAGS您可以为您的编译定义标志(即-std=c++11)。然后您可以包含和定义自定义(INC_PATH并且LIBS: 未在示例中设置)。有了SOURCEDIR你可以指定你的源代码目录(*.c文件)。然后SOURCES基本上讲,对于编译源文件都具有扩展名的文件*.c

Makefile包含了一组规则,其结构如下:

output: inputs
    commandToExecute
Run Code Online (Sandbox Code Playgroud)

生成可执行文件的规则是

yourExecutableName: $(OBJECTS)
    $(CXX) $(WARNING) $^ -o $@
Run Code Online (Sandbox Code Playgroud)

这相当于gcc -Wall -Wextra $(OBJECTS) -o yourExecutableName.

$(OBJECTS)是编译产生的目标文件。当上面的规则被执行时,如果没有找到,make会继续扫描文件,寻找规则来生成它们。在这种情况下,生成这些文件的规则是:

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

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