0

我有一个 C 程序,我想为主机和来宾架构编译它。

主机是 i86 来宾是 ARM

我尝试编写代码如下

CC=arm-none-linux-gnueabi-gcc

all : arm

arm :
    CC=arm-none-linux-gnueabi-gcc

host :
    CC=gcc

clean :
    rm -rf *.o
    rm bench

$(CC) src/main.c src/cpu/cpu.c src/include/common.c -Isrc -lrt -static -o bench

但是当我运行 make arm 或 make host 时,我得到一个缺少分隔符的错误。我怎样才能实现这个功能?

编辑:我遵循了接受的答案,但仍然想要一个目标来完成我的任务。为此,我重写了我的 Makefile,如下所示,

all : bench

host_helper :
    CC=gcc

arm_helper :
    CC=arm-none-linux-gnueabi-gcc

arm : arm_helper bench

host : host_helper bench

all : bench

clean :
    @rm -rf *.o
    @rm -f bench

bench : clean
    $(CC) src/main.c src/cpu/cpu.c src/include/common.c -Isrc -lrt -static -o bench

这是我在运行时获得的输出make arm

CC=arm-none-linux-gnueabi-gcc
cc src/main.c src/cpu/cpu.c src/include/common.c -Isrc -lrt -static -o bench

为什么 CC 变量没有变化?
这是因为 Makefile 为每个目标创建了一个分支,因此一旦 arm_helper 目标完成,CC 变量就会丢失?
是否有可能在这种方法中达到预期的目标?

4

1 回答 1

0

最后一行不应按原样格式化。makefile 的目的是告诉系统输入、输出和它们的依赖关系。因此,您应该更恰当地编写:

bench: src/main.c src/cpu/cpu.c src/include/common.c
    $(CC) $^ -Isrc -lrt -static -o $@

也许包括benchall. 调用将是“make all”或“make arm bench”。

标签(实际上称为目标)并不是真正从 makefile 中的其他目标“调用”的。这需要思想的转变。Makefile 不是程序化的。从本质上讲,它们是依赖树。因此,如果您希望在创建另一个目标时创建一个目标,则将其添加为依赖项;例如:

bench: arm src/main.c src/cpu/cpu.c src/include/common.c
    $(CC) src/main.c src/cpu/cpu.c src/include/common.c -Isrc -lrt -static -o $@

如果我记得我的语法(这可能有效,也可能无效),您可以更清楚地表达为:

bench:: arm
bench:: src/main.c src/cpu/cpu.c src/include/common.c
    $(CC) $^ -Isrc -lrt -static -o $@

要解决您的新生成文件:

首先,你all写了两次。删除一个。其次,不要bench依赖clean. 链接后不会直接删除bench吗?此外,您“根据目标设置变量”的方法也行不通。请尝试类似:

all: bench-host

bench-host: CC=gcc
bench-arm: CC=arm-none-linux-gnueabi-gcc
bench-host bench-arm: src/main.c src/cpu/cpu.c src/include/common.c
    $(CC) $^ -Isrc -lrt -static -o $@

clean:
    @rm -f *.o
    @rm -f bench-*
于 2013-06-03T15:11:24.867 回答