我目前处于学习如何使用C语言编程的开始阶段,我遇到了一些重新编写头文件的问题。例如
我有一个名为
header.h
的头文件,在
中声明了int comp (int, int)
和header.h
在
中定义header.c
在这种情况下,如果我使用comp函数编译test.c,我必须像
一样gcc test.c header.c
第一个问题:每当我gcc看起来太不方便和多余时,必须添加header.c。这是必要的吗?如果没有,有没有办法解决它?如果是这样,为什么?或者,与其使用情况相比,它是不是多余的,我只是抱怨?
第二个问题:如果我使用多个.c文件和header.h中声明的函数,我的gcc必须去
gcc test.c header.c header2.c header3.c .....
再次看起来似乎太多余了。 (从这里开始,与第一个问题相同的问题......)
提前致谢。第一次在SO中提问。请告诉我,无论如何我都可以提高问题的清晰度。
答案 0 :(得分:1)
如果使用shell历史记录功能重新执行命令太费力,您可以创建一个shell宏或脚本来执行该命令。
当您的项目开始变得复杂时,使用构建系统是正常的,您可以在构建系统中配置构建命令,然后在构建时调用构建系统。例如,使用makefile的正确语法编写一个列出所有.c
文件的Makefile,然后在每次构建时键入make
。
您可以考虑使用集成开发环境,它是一个(通常)GUI,包含构建系统和其他有用的功能,在这种情况下,您只需要按键来构建和运行。
答案 1 :(得分:1)
我认为您正在寻找make,它可以自动执行您正在编译的文件。
使用make,你不需要每次都像#gcc test.c header1.c header2.c那样编写...'在终端中(如果你直接在终端上输入命令,是的,你需要一直这样做,这是非常多余的,需要花费大量的时间)。使用make,你只能这样做一次,然后你要做的就是运行make命令。
您可以在https://en.wikibooks.org/wiki/Make查看有关makefile的更多信息。 我希望它可以帮到你。
答案 2 :(得分:0)
编写简单的Makefile对于编译C程序非常有用。这是一个例子
CC = gcc
CFLAGS = -g -Wall
OBJECTS = main.o cfile1.o cfile2.o cfile3.o
run: $(OBJECTS)
$(CC) $(CFLAGS) -o run $(OBJECTS)
编写Makefile时不要担心头文件;只担心你的“.c”文件。此示例Makefile假定您要编译main.c,cfile1.c,cfile2.c和cfile3.c。将C文件添加到Makefile时,请确保使用“.o”而不是“.c”。
Makefile应与C文件位于同一目录中,并且必须使用大写M命名为“Makefile”。只需键入“make”即可编译。然后使用“./run”运行程序。
答案 3 :(得分:0)
通常希望将代码分布在多个文件中;这有助于简化代码管理。头文件提供了一种统一的方法,可以将库或源代码文件中定义的函数公开给其他源代码文件,而不包括这些函数的实际代码。这样,相同的头文件可以包含在多个源代码文件中,而无需为每个文件编译相同的代码。但是,这意味着头文件中函数的源代码也必须提供给编译器。因此,每次编译时都必须将header.c
提供给编译器。
这意味着每次构建项目时都会编译header.c
,这有点多余。解决此问题的一种方法是将header.c
编译为目标文件,然后在构建时将编译器提供给它:
gcc -c header.c -o header.o
gcc header.o test.c
此外,软件开发人员经常喜欢将他们的程序功能分发给其他开发人员,但不提供actaul代码。为此,他们经常使用包含已编译源代码的软件库以及用于访问此代码的头文件。这可能比你想要的多一点,所以我会让你读到它。
所有这些都不是为了减少编译器命令中的冗余,而是用于编译程序中。制作程序员'更容易构建他们的程序,经常使用makefile和IDE。这些可能是您可能需要阅读的内容,但此处发布的其他答案应该是一个很好的起点。