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的网页.也许这篇文章的答案可以显示这样的例子.
查看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).
总的来说,我建议autoconf而automake不是手工制作makefile.只需很少的工作就可以获得一堆Makefile功能.
我尝试了你的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)。
| 归档时间: |
|
| 查看次数: |
16398 次 |
| 最近记录: |