用于arm-linux-gcc的C/C++目标的简单makefile

6
我想使用arm-linux-gcc编译套件[arm-linux-gcc(Buildroot 2011.08)4.3.6]跨架构编译一个简单的ARM程序。我尝试使用一个简单的Makefile来编译C代码,以及另一个简单的Makefile来编译C ++代码。例如,我的C代码的Makefile如下所示,但它不会创建适用于嵌入式系统的ELF二进制文件。主机系统是x64 GNU Linux。
以下是一个非常简单的C程序的makefile:
CC=arm-linux-gcc
CFLAGS=-Wall
main: test.o 

clean:
    rm -f test test.o 

上面复制的makefile仅创建一个扩展名为.o的对象文件,并不会创建ELF二进制文件。
我已经在谷歌上搜索了很久,但似乎找不到一个网页能够展示编译C和C++程序的ARM跨平台makefile的例子。也许本次发布的答案可以展示这样的例子。
2个回答

5
请查看GNU make手册(info make),第10.2节,其中列出了隐式规则的目录,也就是你不需要显式声明命令的规则。像@GregHewgill所想的那样,“链接单个目标文件”隐式规则从N.o生成N,但名称必须匹配。因此,你可以将可执行文件命名为与你的目标文件相同的名称,这样就可以通过运行以下命令来构建:make N
test:

或者(更标准,因为它定义了“all”目标)
all : test

完全足够。您还可以明确地编写规则,就像Greg Hewgill所描述的那样。在这种情况下,标准规则是:

 $(CC) $(LDFLAGS) N.o $(LOADLIBES) $(LDLIBS)

在你的Makefile中包含LDFLAGS和LDLIBS,这样可以更方便用户使用。

(注:我认为LOADLIBES实际上是LOADLIBS,并且作者错过了-o)。

总的来说,我建议使用autoconf和automake代替手动编写Makefile。这将为您提供一组Makefile功能,而付出的工作很少。


3
我试了一下你的Makefile, 并做了以下修改:
test: test.o

在这个变化之后,它正常工作了,并创建了一个名为test的二进制文件。似乎有一些隐含规则知道如何链接whatever,如果它的依赖之一是whatever.o

另一种方式是明确列出规则:

main: test.o
        $(CC) -o $@ $$

这里使用了特殊的宏 $@(代表 目标)和 $$(代表 依赖关系)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接