全志提供的交叉编译环境头文件的问题
-
不支持开发linux内核模块吗?,全志提供的交叉编译环境里找不到module.h kernel.h等头文件,怎么办?谢谢
-
用的是Core-T113-S3 核心板光盘资料提供的虚拟机,里面说已经装好了编译环境,然后想做一个LINUX内核模块驱动,编译找不到头文件。代码里头文件如下:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/tty.h>
#include <linux/sched.h>
#include <linux/net.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <termios.h>
#include <fcntl.h>
#include <linux/in.h>
#include <semaphore.h>
#include <pthread.h> -
好像这个全志提供的虚拟机不是内核开发版的。怎么办啊?
-
用的是全志提供的虚拟机,安装好的编译环境,可是他这个交叉编译环境好像不支持内核开发,他的交叉编译工具链sysroot下的头文件里没有上面我列出的内核开发支持头文件。
-
@arnis 那个虚拟机?你使用的是那个版本的SDK?
-
talowe-t113-linux-sdk_2023_11_10.tar
-
Core-T113-S3 核心板光盘资料,这上面的虚拟机,里面交叉工具链好像不支持内核模块开发
-
@arnis 这个姚望提供的SDK吧,你去问问他们的技术支持吧
-
MCU 是 T113-S3, 能不能提供个开发环境支持LINUX内核开发?
-
你是MCU原厂商,你们不能提供个T113-S3支持LINUX开发的交叉编译环境吗?我去问核心板封装厂商能提供这个计数支持吗?
-
上面那个就是Linux开发环境,找不到头文件因为没有指定Kernel的头文件目录。或者没有在目标板Linux系统上做开发,没有正确配置交叉编译工具链,没有正确配置目标Kernel的引用。
对于驱动开发可以参考:
https://v853.docs.aw-ol.com/soft/dev_gpio/T113没有IDE开发环境,Linux也不能使用Keil,IAR开发,需要学习Linux的新的开发方法
-
我怎么想的是,如果交叉编译工具链下没有module.h文件,那这个编译环境就不支持内核模块开发,配置没什么可调整的,我想全志提供一个支持LINUX内核模块开发的工具链,或者我可以再核心板厂商那里得到这个工具链吗?
-
@arnis 本来就是支持的,只是你配置错误了,makefile怎么写的?
-
麻烦提供一个针对交叉工具链的Makefile模板,谢谢
-
那个虚拟机LINUX内核源码里是有module.h的,抱歉我新手对交叉工具链编译makefile里包含目录的配置不是很了解,那个交叉工具链安装目录下是有自己的linux头文件支持的,里面没有module.h, 这个和LINUX内核源码的头文件怎么配合使用,在makefile里如何设置不是很清楚,麻烦给个具体实现。
-
obj-m := hello.o KERNEL := ../lichee/linux-5.4/ PWD := $(shell pwd) modules : $(MAKE) -C $(KERNEL) M=$(PWD) modules .PHONEY:clean clean : rm -f *.o *.ko
这是一个基本的内核模块Makefile。下面是各个变量和命令的含义:
obj-m := hello.o
定义要编译的内核模块的目标文件名为
hello.o
。这里使用了obj-m
变量,它是一个特殊的变量,用于编译内核模块。KERNEL := ../lichee/linux-5.4/
定义内核源代码目录的位置,这里是
../lichee/linux-5.4/
。根据实际情况修改该路径。PWD := $(shell pwd)
定义当前目录的路径为
PWD
。这里使用了shell
命令来获取当前目录的路径。modules : $(MAKE) -C $(KERNEL) M=$(PWD) modules
定义一个名为
modules
的伪目标,它的依赖关系为空。执行该目标时,会进入内核源代码目录$(KERNEL)
,并使用M=$(PWD)
选项告诉内核Makefile,模块源代码在当前目录中。最后执行modules
目标,编译内核模块。.PHONEY:clean clean : rm -f *.o *.ko
定义一个伪目标
clean
,它的依赖关系为空。执行该目标时,会删除当前目录下的所有.o
和.ko
文件。如果需要编译多个内核模块,可以将
obj-m
变量中的目标文件名替换为多个目标文件名,如obj-m := hello.o world.o another.o
。此外,还可以在Makefile中定义其他命令,比如安装、卸载等命令,以更方便地管理内核模块。编译指令如下:
make ARCH=arm CROSS_COMPILE=$(pwd)/../prebuilt/gcc/linux-x86/arm/toolchain-sunxi-glibc/toolchain/bin/arm-openwrt-linux-gnueabi-
这是一个编译ARM架构的程序的Makefile命令。下面是各个参数的含义:
ARCH=arm
指定目标架构为ARM。
CROSS_COMPILE=$(pwd)/../prebuilt/gcc/linux-x86/arm/toolchain-sunxi-glibc/toolchain/bin/arm-openwrt-linux-gnueabi-
指定交叉编译器的路径及前缀。这里使用了
$(pwd)
变量获取当前工作目录的路径,并拼接上交叉编译器的路径及前缀。根据实际情况修改该路径。使用交叉编译器可以在x86主机上编译ARM平台的程序。
arm-openwrt-linux-gnueabi-
是交叉编译器的前缀,表示编译出来的可执行文件适用于OpenWrt系统。在执行该命令之前,需要确保已经安装了相应的交叉编译工具链,并将其加入环境变量中。如果没有安装,请参考相关文档进行安装。
-
CC [M] /home/talowe/hpm/ctrlBoard.o
In file included from ./include/asm-generic/int-ll64.h:11:0,
from ./arch/arm/include/uapi/asm/types.h:5,
from ./include/uapi/linux/types.h:5,
from ./include/linux/types.h:6,
from ./include/linux/list.h:5,
from ./include/linux/module.h:9,
from /home/talowe/hpm/ctrlBoard.c:1:
./include/uapi/asm-generic/int-ll64.h:12:10: fatal error: asm/bitsperlong.h: No such file or directory
#include <asm/bitsperlong.h>已经设置了Makefile, make的结果是有头文件找不到,但是在/usr/src/linux-headers-4.15.0-142/include/asm-generic
下是有这个头文件的,但是他不在asm/下,怎么设置解决这个问题?谢谢 -
./include/uapi/asm-generic/int-ll64.h:12:10: fatal error: asm/bitsperlong.h: No such file or directory
#include <asm/bitsperlong.h>
发现LINUX源码arch下的arm里没有这个头文件, arm64下的有,如果在内核顶层的Makefile的LINUXINCLUDE宏中少加入了-I$(srctree)/arch/$(SRCARCH)/include/uapi \路径(在这个路径下呢),加入后改为编译arch=arm64,又有错误arm-linux-gnueabi-gcc: error: unrecognized command line option ‘-mgeneral-regs-only’ -
@awwwwa 设置了Makefile编译,出错:./include/uapi/asm-generic/int-ll64.h:12:10: fatal error: asm/bitsperlong.h: No such file or directory
#include <asm/bitsperlong.h>
发现LINUX源码arch下的arm里没有这个头文件, arm64下的有,如果在内核顶层的Makefile的LINUXINCLUDE宏中少加入了-I$(srctree)/arch/$(SRCARCH)/include/uapi \路径(在这个路径下呢),加入后改为编译arch=arm64,又有错误arm-linux-gnueabi-gcc: error: unrecognized command line option ‘-mgeneral-regs-only’。请帮忙看看,谢谢 -
我安装的工具链只有arm-linux-gnueabi-gcc,没有aarch64-none-linux-gnu,这个情况不能进行arch=arm64编译吧?
-
@arnis 请使用SDK中提供的工具链,路径
prebuilt/gcc/linux-x86/arm/toolchain-sunxi-glibc/toolchain/bin/arm-openwrt-linux-gnueabi-
-
@awwwwa 我安装的工具链里只有arm-linux-gnueabi-gcc,没有aarch64-linux-gnu,也没有你说的这个,因为那个头文件只在arch/arm64下有,我要设置arch=arm64,不用aarch64-linux-gnu恐怕不行吧?
-
@awwwwa 我拿到的SDK工具链只有arm-linux-gnueabi-gcc
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号