【问题标题】:Simple makefile for C/C++ targets used with arm-linux-gcc与 arm-linux-gcc 一起使用的 C/C++ 目标的简单生成文件
【发布时间】:2012-01-04 18:30:04
【问题描述】:

我想使用 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 

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

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

【问题讨论】:

    标签: linux gcc arm cross-compiling gnu-make


    【解决方案1】:

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

    test:
    

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

    all : test
    

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

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

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

    (原文:我觉得LOADLIBES真的是LOADLIBS,作者漏掉了-o)。

    总的来说,我建议使用autoconfautomake 而不是手动生成makefile。为您提供大量 Makefile 功能,只需很少的工作。

    【讨论】:

    • 感谢 thiton 的精彩评论;非常感谢。
    【解决方案2】:

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

    test: test.o
    

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

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

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

    这使用特殊的宏$@(表示目标)和$$(表示依赖项)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多