首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Raspbian中创建Makefile

在Raspbian中创建Makefile
EN

Stack Overflow用户
提问于 2014-12-11 16:53:04
回答 2查看 8.4K关注 0票数 0

我正在尝试用Raspbian (Raspberry Pi)为我的C程序创建一个Makefile。我的程序由一堆.c和.h文件组成。我看过无数的Makefile,但我就是不明白它是如何处理多个文件的。Makefile中总是有.o文件,但据我所知,目标文件是编译的结果,所以当我试图编译我的.c文件时,我没有任何o文件。

请给我解释一下这是怎么回事。

编辑:

谢谢。所以我试了一下,它开始编译了,但是有错误‘多个定义’。示例:

以下是我的文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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‘放在哪里?对于每个文件,我都会得到错误‘多个定义’

EN

回答 2

Stack Overflow用户

发布于 2014-12-11 17:10:00

make规则的基本语法为:

代码语言:javascript
复制
target … : prerequisites …
    recipe
    …
    …

分号的左边是目标。目标是您的目标文件(.o)。分号的右侧是创建此文件所需的文件。这些文件是源文件(.c)。

让我们给出一个这样的规则可能是什么样子的基本示例。

代码语言:javascript
复制
%.o: %.c
    gcc -c $< -o $@

%符号是一个通配符。%.o表示以.o结尾的所有内容。所以,如果你想创建一个目标文件,你可以说make file.omake会尝试找到一条规则来创建这个目标文件。这恰好是我刚才举例说明的规则,因为file.o%.o匹配。

然后是recipe。这就是将要执行的内容。这就是我们对gcc -c $< -o $@所做的。$<$@分别表示targetprerequisites

那么,当你“只是”想要构建你的程序时,会发生什么呢?通常,您将键入make,它将进行构建。键入make时使用的默认规则是all。因此,如果您制定了一个关于all的规则,那么您可以指定要创建哪些文件来构建您的程序。这样的规则示例:

代码语言:javascript
复制
all: main

然后,当调用make时,它将找到该规则并发现它需要main。要创建main,您需要另一个规则:

代码语言:javascript
复制
main: file.o

这条规则指出,要构建main,您需要file.o。因此,当您将所有示例规则放在一起时,您会得到以下结果:

代码语言:javascript
复制
all: main

main: file.o

%.o: %.c
    gcc -c $< -o $@

请注意,您可以指定多个文件,因此您可以使用file.o main.o other_file.o等来代替file.o。您指定的每个前提条件都将被满足,前提是它们可以找到一个规则来创建它。

票数 2
EN

Stack Overflow用户

发布于 2014-12-11 17:26:48

一个非常简单但典型的makefile可能如下所示

代码语言:javascript
复制
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)规则将确保所有目标文件都是从源文件构建的,然后将目标文件链接到生成的可执行文件中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27418767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档