我有一个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变量就会丢失吗?
是否有可能在这种方法中实现预期的目标?
答案 0 :(得分:0)
最后一行不应该按原样格式化。 makefile的目的是告诉系统输入,输出及其依赖关系。因此,你应该更恰当地写一下:
bench: src/main.c src/cpu/cpu.c src/include/common.c
$(CC) $^ -Isrc -lrt -static -o $@
也许在bench
中包含all
。调用将是“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 $@
要解决新的makefile:
首先,你有两次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-*