我试图使用mips交叉编译器交叉编译简单的hello.c,这会引发错误。
下面是错误
satya@satya-dev:~/Test/kernel/check$ make ARCH=mips CROSS_COMPILE=mips-buildroot-linux-uclib-
make -C /opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin/ M=/home/satya/Test/kernel/check modules
make[1]: Entering directory '/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin'
make[1]: *** No rule to make target 'modules'. Stop.
make[1]: Leaving directory '/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin'
Makefile:7: recipe for target 'all' failed
make: *** [all] Error 2
我的Makefile是:
obj-m := hello.o
#KDIR := /lib/modules/$(shell uname -r)/build/
KDIR := /opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin/
#PWD = $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(shell pwd) modules
clean:
$(MAKE) -C $(KDIR) M=$(shell pwd) clean
我也在/ bin中添加了编译器路径
satya@satya-dev:~/Test/kernel/check$ echo $PATH
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/sbin:/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL:/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin
即使没有makefile,编译器也可以正常工作
satya@satya-dev:~/Test/kernel/check$ /opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin/mips-buildroot-linux-uclibc-gcc in.c -o temp
satya@satya-dev:~/Test/kernel/check$ ll
total 24
-rw-rw-r-- 1 satya satya 1135 Aug 10 05:06 hello.c
-rw-rw-r-- 1 satya satya 0 Aug 10 06:29 Module.symvers
-rw-rw-r-- 1 satya satya 52 Aug 10 07:48 modules.order
-rw-rw-r-- 1 satya satya 66 Aug 10 07:59 in.c
-rw-rw-r-- 1 satya satya 281 Aug 10 08:30 Makefile
-rwxrwxr-x 1 satya satya 5604 Aug 10 09:37 temp
我知道我在犯一些模糊的错误,但是我无法弄清楚。谁能告诉我我要去哪里错了?
答案 0 :(得分:2)
我知道我在犯一些模糊的错误,但是我无法弄清楚。 谁能告诉我我要去哪里错了?
不,这不是“模糊的错误”。您的Makefile具有有效的 form ,但其中的内容几乎没有意义。
在命令行make
调用中,您没有命名目标,因此make
在Makefile中选择默认的(第一个)“ all”。就目前而言,这可能就是您想要的。
目标“全部”的配方仅包含一个命令:
$(MAKE) -C $(KDIR) M=$(shell pwd) modules
这将在目录make
中运行一个子{$(KDIR)
,这很令人惊讶,因为它似乎不为KDIR
设置的值是您要构建的项目的一部分。
要求子make
建立一个名为'modules'的目标,并且错误消息表明make
没有如何执行此操作的规则。它可能在构建目录中看不到一个makefile(使用它可以识别的任何名称),但是如果确实看到一个makefile,则它不包含该目标的规则。我注意到您提出的Makefile
也没有针对此类目标的规则,因此我也不知道该目标来自何处。
即使没有makefile,编译器也可以正常工作
至少这是个好消息。
交叉编译的关键是为此目的使用正确的工具链。您可以通过多种方式来执行此操作,但是大多数方式都以适当地定义一些标准make变量开始。例如:
tooldir = /opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin
CC = $(tooldir)/mips-buildroot-linux-uclibc-gcc
LD = $(CC)
CC
变量命名为C编译器,而LD
变量命名为链接器。您可能还需要设置其他变量,例如,CFLAGS
用于要使用的任何C编译器标志,LDFLAGS
用于任何链接器标志。
您可以通过多种方式进行操作,但是最简单的方法是将默认目标命名为“ hello”,而不是“ all”:
hello:
这可能就是您专门构建“ hello”程序所需要的。