2012-01-04 141 views
4

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

这是我很简单的makefile的一个C程序列表:

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

clean: 
    rm -f test test.o 

转载上述内容生成文件只创建与扩展的.o目标文件,并不会创建一个ELF二进制文件。

我已经谷歌搜索一个很好的解决方案,但我似乎无法找到一个网页显示示例为C和C++程序交叉编译ARM makefiles。也许这篇文章的答案可能会显示这样的例子。

回答

3

我想你Makefile,改变了以下内容:

test: test.o 

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

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

main: test.o 
     $(CC) -o [email protected] $$ 

它使用专用宏[email protected](这意味着目标)和$$(这意味着依赖)。

+0

谢谢,Greg;这很好。 – 2012-01-04 18:49:02

5

看看GNU make手册(info make),Section 10.2。它有一个隐式规则的目录,即你不需要明确声明命令的规则。就像@GregHewgill所认为的,“链接单个目标文件”隐式规则从N.o开始建立N,但名称必须匹配。因此,您可以命名您的可执行喜欢你的目标文件,在这种情况下

test: 

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

all : test 

完全足够了。您也可以明确地写出规则,如Greg Hewgill所述。在这种情况下,标准的规则是:

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

包含的LDFLAGS,并在你的Makefile LDLIBS,它使生活更方便用户使用。

(原文如此:我认为LOADLIBES真的是LOADLIBS,而作者错过了-o)。总体而言,我建议使用autoconfautomake而不是手动滚动makefiles。为您提供一大堆Makefile功能,只需很少的工作。

+0

谢谢你的好评,thiton;这非常感谢。 – 2012-01-04 20:08:55