我正在尝试用Raspbian (Raspberry Pi)为我的C程序创建一个Makefile。我的程序由一堆.c和.h文件组成。我看过无数的Makefile,但我就是不明白它是如何处理多个文件的。Makefile中总是有.o文件,但据我所知,目标文件是编译的结果,所以当我试图编译我的.c文件时,我没有任何o文件。
请给我解释一下这是怎么回事。
编辑:
谢谢。所以我试了一下,它开始编译了,但是有错误‘多个定义’。示例:
以下是我的文件:
main.c main.h
calibration.c calibration.h
file.c file.h
frame.c frame.h
gamepad.c gamepad.h
gpio.c gpio.h
uart.c uart.h
types.h这是我的makefile:
all: main
main: main.o calibration.o file.o frame.o gamepad.o gpio.o uart.o
%.o: %.c
gcc -c -std=c99 -Wall $< -o $@ -lncurses我可以把'types.h‘放在哪里?对于每个文件,我都会得到错误‘多个定义’
发布于 2014-12-11 17:10:00
make规则的基本语法为:
target … : prerequisites …
recipe
…
…分号的左边是目标。目标是您的目标文件(.o)。分号的右侧是创建此文件所需的文件。这些文件是源文件(.c)。
让我们给出一个这样的规则可能是什么样子的基本示例。
%.o: %.c
gcc -c $< -o $@%符号是一个通配符。%.o表示以.o结尾的所有内容。所以,如果你想创建一个目标文件,你可以说make file.o,make会尝试找到一条规则来创建这个目标文件。这恰好是我刚才举例说明的规则,因为file.o与%.o匹配。
然后是recipe。这就是将要执行的内容。这就是我们对gcc -c $< -o $@所做的。$<和$@分别表示target和prerequisites。
那么,当你“只是”想要构建你的程序时,会发生什么呢?通常,您将键入make,它将进行构建。键入make时使用的默认规则是all。因此,如果您制定了一个关于all的规则,那么您可以指定要创建哪些文件来构建您的程序。这样的规则示例:
all: main然后,当调用make时,它将找到该规则并发现它需要main。要创建main,您需要另一个规则:
main: file.o这条规则指出,要构建main,您需要file.o。因此,当您将所有示例规则放在一起时,您会得到以下结果:
all: main
main: file.o
%.o: %.c
gcc -c $< -o $@请注意,您可以指定多个文件,因此您可以使用file.o main.o other_file.o等来代替file.o。您指定的每个前提条件都将被满足,前提是它们可以找到一个规则来创建它。
发布于 2014-12-11 17:26:48
一个非常简单但典型的makefile可能如下所示
SOURCES = source1.c source2.c source3.c
OBJECTS = $(SOURCES:%.c=%.o)
TARGET = myExecutable
$(TARGET): $(OBJECTS)
gcc $^ -o $@
%.o: %.c
gcc -c $< -o $@复杂的部分:
这是一个变量定义,它将字符串"source1.c source2.c source3.c赋给变量SOURCES.
$(SOURCES:%.c=%.o)这是patsubst text function的简写。并告诉gcc输出一个带有目标($@).
%.o: %.c名称的文件,这是使目标文件依赖于它们的源文件的规则。因此,如果您有source1.c,那么source1.o将依赖于源文件这是将源文件(第一个依赖项,$<)编译为目标文件(使用-c选项)并将其命名为规则source1.c目标的命令另请注意,如果在没有特定目标的情况下调用make,则将选择第一个规则。对于上面的makefile,$(TARGET): $(OBJECTS)规则将确保所有目标文件都是从源文件构建的,然后将目标文件链接到生成的可执行文件中。
https://stackoverflow.com/questions/27418767
复制相似问题