无法交叉编译mips

时间:2018-08-10 13:54:41

标签: c linux mips cross-compiling

我试图使用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

我知道我在犯一些模糊的错误,但是我无法弄清楚。谁能告诉我我要去哪里错了?

1 个答案:

答案 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”程序所需要的。