无法交叉编译 mip
Unable to cross-compile for mips
我尝试使用 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
我知道我犯了一些模糊的错误,但我想不通。谁能告诉我哪里错了?
I know I am doing some vague mistake, but I couldn't figure it out.
Can anyone tell me where am I going wrong?
不,不是 "vague mistake"。您的 Makefile 具有有效的 形式 ,但内容几乎没有意义。
在您的命令行 make
调用中,您没有命名目标,因此 make
选择 Makefile 中的默认(第一个)目标,'all'。就目前而言,这可能就是您想要的。
目标 'all' 的配方只包含一个命令:
$(MAKE) -C $(KDIR) M=$(shell pwd) modules
这在目录 $(KDIR)
中运行一个子 make
,这令人惊讶,因为它看起来不像为 KDIR
设置的值是您尝试的项目的一部分建造。
子make
被要求构建一个名为'modules' 的目标,错误消息表明make
没有关于如何构建的任何规则。可能它在构建目录中没有看到 makefile(在它识别的任何名称下),但如果它确实看到了一个,那么它不包含该目标的规则。我注意到您提供的 Makefile
也没有针对此类目标的规则,所以我不知道它来自哪里。
Even compiler works fine without 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" 程序所需的全部内容。
我尝试使用 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
我知道我犯了一些模糊的错误,但我想不通。谁能告诉我哪里错了?
I know I am doing some vague mistake, but I couldn't figure it out. Can anyone tell me where am I going wrong?
不,不是 "vague mistake"。您的 Makefile 具有有效的 形式 ,但内容几乎没有意义。
在您的命令行 make
调用中,您没有命名目标,因此 make
选择 Makefile 中的默认(第一个)目标,'all'。就目前而言,这可能就是您想要的。
目标 'all' 的配方只包含一个命令:
$(MAKE) -C $(KDIR) M=$(shell pwd) modules
这在目录 $(KDIR)
中运行一个子 make
,这令人惊讶,因为它看起来不像为 KDIR
设置的值是您尝试的项目的一部分建造。
子make
被要求构建一个名为'modules' 的目标,错误消息表明make
没有关于如何构建的任何规则。可能它在构建目录中没有看到 makefile(在它识别的任何名称下),但如果它确实看到了一个,那么它不包含该目标的规则。我注意到您提供的 Makefile
也没有针对此类目标的规则,所以我不知道它来自哪里。
Even compiler works fine without 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" 程序所需的全部内容。