【问题标题】:Unable to cross-compile for mips无法交叉编译 mips
【发布时间】:2019-01-18 03:54:57
【问题描述】:

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

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

【问题讨论】:

  • KDIR 是部分内核源代码的路径,而不是交叉编译器的 bin 目录。你需要更多这样的东西:blukat29.github.io/2017/12/cross-compile-arm-kernel-module
  • 您的 makefile 目标不会调用您的 gcc 来编译任何内容,也不会提及 hello.c - 他们只是在 KDIR 中运行 make

标签: c linux mips cross-compiling


【解决方案1】:

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

不,这不是“模糊的错误”。您的 Makefile 具有有效的 form,但内容几乎没有意义。

在您的命令行make 调用中,您没有命名目标,因此make 在您的Makefile 中选择默认(第一个)目标,“全部”。就目前而言,这可能就是您想要的。

target 'all' 的配方只包含一个命令:

       $(MAKE) -C $(KDIR) M=$(shell pwd) modules

这会在$(KDIR) 目录中运行一个子make,这令人惊讶,因为它看起来不像为KDIR 设置的值是您正在尝试构建的项目的一部分。

sub-make 被要求构建一个名为“modules”的目标,错误消息表明make 没有任何关于如何执行此操作的规则。可能它在构建目录中没有看到生成文件(在它识别的任何名称下),但如果它确实看到了,那么它不包含该目标的规则。我注意到您提供的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”程序所需的全部内容。

【讨论】:

  • 我去了目录“/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin”。这里我有这样的交叉编译器 $ ll | grep mips-buildroot-linux-uclibc-gcc lrwxrwxrwx 1 501 501 17 May 4 2017 mips-buildroot-linux-uclibc-gcc -> toolchain-wrapper 但我没有任何 make 文件。我该如何继续
  • 不,@satyaGolladi,重点是你不应该去那个目录。它包含您必须使用但您不想在那里执行构建的工具。我已经为您提供了一个完整或几乎完整的示例,说明如何编写一个简单的 Makefile 来构建您的“hello”程序。
  • 约翰,在我的新制作文件中,我应该用什么替换下面的行?你好:$(KDIR) -C $(CC) M=$(shell pwd) module 注意:我是驱动开发新手,请多多包涵
  • @satyaGolladi,对于从名为“hello.c”的单个源文件构建名为“hello”的程序,您可以将该行替换为空。零线配方。只需将默认目标命名为“hello”,并设置我在答案中描述的变量。我的意思是说“这可能就是专门构建“hello”程序所需的全部内容”。
猜你喜欢
  • 2011-07-14
  • 2018-05-31
  • 2017-08-29
  • 2014-07-18
  • 2019-09-27
  • 1970-01-01
  • 2019-01-21
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多