C 创建make文件

C 创建make文件,c,makefile,C,Makefile,我知道互联网上有无数关于makefiles的资源,但我仍然不理解。目前我有3个c文件PolyCalculator.main.c PolyCalculator.c PolyCalculator.h和Polyfunctions.c 到目前为止我有 PolyCalculator: PolyCalculator.o PolyCalculatorMain.c gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c PolyCalculator.

我知道互联网上有无数关于makefiles的资源,但我仍然不理解。目前我有3个c文件PolyCalculator.main.c PolyCalculator.c PolyCalculator.h和Polyfunctions.c

到目前为止我有

PolyCalculator: PolyCalculator.o PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c PolyCalculator.o

PolyCalculator.o:   PolyCalculator.c 
    gcc -Wall -ggdb -c PolyCalculator.c PolyCalculator.h

clean:
     rm PolyCalculator *.o *~ *#
如果您对填写此文件有任何帮助或解释,我们将不胜感激。
注意我只是开始,所以我不想要任何复杂的代码,因为在编译命令中我无法理解它,通常您不会指定.h文件。预处理器(在编译器之前运行)在遇到#include语句时会包含它们。这是我唯一能看到的

.h文件确实作为依赖项显示在Makefiles中,因为对它们的更改可能需要重新编译使用它们的代码

我想说的是,基本规则是在依赖项行中包含任何内容,如果这些内容发生更改,则需要重新编译

PolyCalculator: PolyCalculator.o PolyFunctions.o PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c PolyCalculator.o PolyFunctions.o

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
 rm PolyCalculator *.o *~ *#
Makefiles允许您拥有可重用的变量。例如,您可以使用 变量中的编译器选项:

options=-Wall -ggdb
obj_files=PolyCalculator.o PolyFunctions.o 

PolyCalculator: ${obj_files} PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c ${obj_files}

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
     rm PolyCalculator *.o *~ *#
然后你用括号和一个美元符号

gcc ${options}
您还可以将其分解:

debug=-ggdb

warnings=-Wall

options=${warnings} ${debug}
还可以将所有对象文件合并到一个变量中:

options=-Wall -ggdb
obj_files=PolyCalculator.o PolyFunctions.o 

PolyCalculator: ${obj_files} PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c ${obj_files}

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
     rm PolyCalculator *.o *~ *#

在compile命令中,通常不指定.h文件。预处理器(在编译器之前运行)在遇到#include语句时会包含它们。这是我唯一能看到的

.h文件确实作为依赖项显示在Makefiles中,因为对它们的更改可能需要重新编译使用它们的代码

我想说的是,基本规则是在依赖项行中包含任何内容,如果这些内容发生更改,则需要重新编译

PolyCalculator: PolyCalculator.o PolyFunctions.o PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c PolyCalculator.o PolyFunctions.o

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
 rm PolyCalculator *.o *~ *#
Makefiles允许您拥有可重用的变量。例如,您可以使用 变量中的编译器选项:

options=-Wall -ggdb
obj_files=PolyCalculator.o PolyFunctions.o 

PolyCalculator: ${obj_files} PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c ${obj_files}

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
     rm PolyCalculator *.o *~ *#
然后你用括号和一个美元符号

gcc ${options}
您还可以将其分解:

debug=-ggdb

warnings=-Wall

options=${warnings} ${debug}
还可以将所有对象文件合并到一个变量中:

options=-Wall -ggdb
obj_files=PolyCalculator.o PolyFunctions.o 

PolyCalculator: ${obj_files} PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c ${obj_files}

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
     rm PolyCalculator *.o *~ *#

在compile命令中,通常不指定.h文件。预处理器(在编译器之前运行)在遇到#include语句时会包含它们。这是我唯一能看到的

.h文件确实作为依赖项显示在Makefiles中,因为对它们的更改可能需要重新编译使用它们的代码

我想说的是,基本规则是在依赖项行中包含任何内容,如果这些内容发生更改,则需要重新编译

PolyCalculator: PolyCalculator.o PolyFunctions.o PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c PolyCalculator.o PolyFunctions.o

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
 rm PolyCalculator *.o *~ *#
Makefiles允许您拥有可重用的变量。例如,您可以使用 变量中的编译器选项:

options=-Wall -ggdb
obj_files=PolyCalculator.o PolyFunctions.o 

PolyCalculator: ${obj_files} PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c ${obj_files}

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
     rm PolyCalculator *.o *~ *#
然后你用括号和一个美元符号

gcc ${options}
您还可以将其分解:

debug=-ggdb

warnings=-Wall

options=${warnings} ${debug}
还可以将所有对象文件合并到一个变量中:

options=-Wall -ggdb
obj_files=PolyCalculator.o PolyFunctions.o 

PolyCalculator: ${obj_files} PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c ${obj_files}

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
     rm PolyCalculator *.o *~ *#

在compile命令中,通常不指定.h文件。预处理器(在编译器之前运行)在遇到#include语句时会包含它们。这是我唯一能看到的

.h文件确实作为依赖项显示在Makefiles中,因为对它们的更改可能需要重新编译使用它们的代码

我想说的是,基本规则是在依赖项行中包含任何内容,如果这些内容发生更改,则需要重新编译

PolyCalculator: PolyCalculator.o PolyFunctions.o PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c PolyCalculator.o PolyFunctions.o

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
 rm PolyCalculator *.o *~ *#
Makefiles允许您拥有可重用的变量。例如,您可以使用 变量中的编译器选项:

options=-Wall -ggdb
obj_files=PolyCalculator.o PolyFunctions.o 

PolyCalculator: ${obj_files} PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c ${obj_files}

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
     rm PolyCalculator *.o *~ *#
然后你用括号和一个美元符号

gcc ${options}
您还可以将其分解:

debug=-ggdb

warnings=-Wall

options=${warnings} ${debug}
还可以将所有对象文件合并到一个变量中:

options=-Wall -ggdb
obj_files=PolyCalculator.o PolyFunctions.o 

PolyCalculator: ${obj_files} PolyCalculatorMain.c
    gcc -Wall -ggdb -o PolyCalculator PolyCalculatorMain.c ${obj_files}

PolyCalculator.o:   PolyCalculator.c PolyCalculator.h
    gcc -Wall -ggdb -c PolyCalculator.c 

PolyFunctions.o: PolyFunctions.c PolyFunctions.h
    gcc -Wall -ggdb -c PolyFunctions.c

clean:
     rm PolyCalculator *.o *~ *#

因为您没有给出您想要更改/修改的内容的明确说明,所以我将如下所示为您编写makefile,尽管有些人可能(将?)不同意我的观点。 我看到你编辑了你原来的帖子,提到了PolyFunctions.cpp(我猜是这样的) 是一个多功能函数

好的,我所做的改变(以及为什么)

  • 首先,我喜欢使用变量,然后在触发规则时进行扩展。我发现这是一种方便的方法,可以确保所有步骤使用相同的设置。此外,我还添加了一些变量,如果需要向编译添加标题,可以使用这些变量(即
    INCS
    变量)。我还为链接器分解了命令和标志,
    LK
    LKFLAGS
    LIBS
    变量。目前,这些都是空的

  • 我为创建的各种对象文件添加了一个变量,我喜欢这样做,因为如果我向项目中添加一个新的源文件,我必须做两件事,第一件事是为它编写一个规则,第二件事是将它添加到
    OBJS
    变量中。在我看来,添加新源文件时需要做的事情越多,我忘记某些事情的可能性就越大

  • 我为最终的程序名添加了一个变量。同样,如果我想更改它,它会变得简单…而且我很懒-键入
    $(PROG)
    比键入
    PolyCalculator
    :)更容易,也不容易出错

  • 目标的排序是个人的选择,我总是将重建主程序的目标作为makefile中的第一个(或默认)目标。这样,当我运行
    make
    时,我只构建自上次构建以来发生变化的内容。我在顶部附近放置了一条规则,用于对应用程序进行总体重建,在上面的示例中,这是
    rebuild
    规则。运行
    make rebuild
    在操作上等同于
    make clean;制作
    ;但我更喜欢一个单一的目标来实现这一点

  • 我使用第1点中定义的变量重写了规则

  • 我将
    -f
    标志添加到
    rm
    中,这样即使找不到文件,clean也可以完成所有操作。同样,这往往是个人偏好


  • 因为您没有给出您想要更改/修改的内容的真正明确的保留,所以我将如下所示编写makefile,尽管