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

Nic*_*nar 5 linux gcc arm cross-compiling gnu-make

我想使用arm-linux-gcc编译器套件[arm-linux-gcc(Buildroot 2011.08)4.3.6]交叉编译ARM架构的简单程序.我试图使用一个简单的makefile来编译C代码,另一个简单的makefile用于编译C++代码.例如,我的C代码生成文件在下面重现,但它不会创建一个ELF二进制文件,以便在我的嵌入式系统上运行.主机系统是x64 GNU Linux.

这是我为C程序编写的非常简单的makefile的列表:

CC=arm-linux-gcc
CFLAGS=-Wall
main: test.o 

clean:
    rm -f test test.o 
Run Code Online (Sandbox Code Playgroud)

上面复制的makefile只创建一个扩展名为.o的目标文件,而不创建ELF二进制文件.

我已经用Google搜索了一个很好的解决方案,但我似乎找不到一个显示C和C++程序的交叉编译ARM makefile的网页.也许这篇文章的答案可以显示这样的例子.

thi*_*ton 5

查看GNU make手册(info make),第10.2节.它有一个隐式规则的目录,即您不需要显式声明命令的规则.就像@GregHewgill所想的那样,"链接单个目标文件"隐式规则构建N起来N.o,但名称必须匹配.因此,您可以将可执行文件命名为目标文件,在这种情况下

test:
Run Code Online (Sandbox Code Playgroud)

或(更标准,因为它定义了all目标)

all : test
Run Code Online (Sandbox Code Playgroud)

完全够了.你也可以明确地写出规则,就像Greg Hewgill所描述的那样.在这种情况下,标准规则是:

 $(CC) $(LDFLAGS) N.o $(LOADLIBES) $(LDLIBS)
Run Code Online (Sandbox Code Playgroud)

在您的Makefile中包含LDFLAGS和LDLIBS,它使用户的生活更轻松.

(原文:我认为LOADLIBES真的是LOADLIBS,作者错过了-o).

总的来说,我建议autoconfautomake不是手工制作makefile.只需很少的工作就可以获得一堆Makefile功能.


Gre*_*ill 3

我尝试了你的Makefile并更改了以下内容:

test: test.o
Run Code Online (Sandbox Code Playgroud)

它在更改后起作用并创建了一个名为 的二进制文件test。似乎有一些隐式规则知道whatever如果其依赖项之一是 则如何链接whatever.o

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

main: test.o
        $(CC) -o $@ $$
Run Code Online (Sandbox Code Playgroud)

这使用特殊宏$@(这意味着target)和$$(这意味着dependency)。