openwrt环境下,编译kernel时,开启CONFIG_INPUT_MOUSE编译出错

本文介绍了解决编译Linux kernel时配置CONFIG_INPUT_MOUSE出现的错误问题,特别是当使用较高版本的gcc(如gcc5.x)时发生的未定义引用错误。通过修改特定的驱动文件可以解决此问题。

编译kernel时,开启CONFIG_INPUT_MOUSE编译出错,提示

psmouse.ko error

undefined reference to `lifebook_detect'

undefined reference to `fsp_detect'


原因是gcc版本太高(gcc 5.x)导致


修改文件 drivers/input/mouse/lifebook.h 和文件

drivers/input/mouse/sentelic.h

@@ -16,14 +16,14 @@ void lifebook_module_init(void); 
int lifebook_detect(struct psmouse *psmouse, bool set_properties);
 int lifebook_init(struct psmouse *psmouse);
 #else
-inline void lifebook_module_init(void)
+static inline void lifebook_module_init(void)
 {
 }
-inline int lifebook_detect(struct psmouse *psmouse, bool set_properties)
+static inline int lifebook_detect(struct psmouse *psmouse, bool set_properties)
 {
 	return -ENOSYS;
 }
-inline int lifebook_init(struct psmouse *psmouse)
+static inline int lifebook_init(struct psmouse *psmouse)
 {
 	return -ENOSYS;
 }


@@ -123,11 +123,11 @@ struct fsp_data {
 extern int fsp_detect(struct psmouse *psmouse, bool set_properties);
 extern int fsp_init(struct psmouse *psmouse);
 #else
-inline int fsp_detect(struct psmouse *psmouse, bool set_properties)
+static inline int fsp_detect(struct psmouse *psmouse, bool set_properties)
 {
 	return -ENOSYS;
 }
-inline int fsp_init(struct psmouse *psmouse)
+static inline int fsp_init(struct psmouse *psmouse)
 {
 	return -ENOSYS;
 }

参考:

https://github.com/torvalds/linux/tree/master/drivers/input/mouse


<think>我们正在讨论在OpenWrt中单独编译内核的方法。用户之前的问题是关于一个复杂的make命令,该命令用于编译内核模块。现在用户明确询问如何在OpenWrt中单独编译内核。 在OpenWrt中,通常我们使用其构建系统来编译整个固件,但有我们需要单独编译内核,例如进行内核开发或调试。 参考OpenWrt官方文档和构建系统的设计,以下是单独编译内核的步骤: 1. **准备工作**:确保已经配置好OpenWrt构建环境,并且已经运行过`make menuconfig`选择了目标平台和配置。 2. **编译内核**: OpenWrt构建系统提供了单独编译内核的目标。我们可以使用以下命令: ```bash make target/linux/compile ``` 或者更精确地,使用: ```bash make target/linux/install ``` 但是,请注意,这些目标可能会编译并安装内核模块,但不会生成单独的内核镜像文件(如vmlinux或zImage)。 3. **获取内核镜像**: 实际上,OpenWrt构建系统将内核镜像输出到`bin/targets/<target>/<subtarget>/`目录中,该目录是在编译整个固件生成的。但是,如果我们只想编译内核而不编译整个系统,我们可以使用: ```bash make target/linux/install V=s ``` 然后,内核镜像文件(如vmlinux)将出现在构建目录中。具体路径为: ``` build_dir/target-<arch>/linux-<target>/vmlinux ``` 或者压缩的内核镜像(如zImage)在: ``` build_dir/target-<arch>/linux-<target>/image/ ``` 4. **另一种方法:进入内核构建目录手动编译**: 我们可以进入OpenWrt构建系统的内核构建目录,然后使用标准的Linux内核编译方法,但需要使用OpenWrt设置的交叉编译器和配置。 步骤如下: ```bash cd <openwrt_root>/build_dir/target-<arch>/linux-<target>/linux-<version>/ make ARCH=arm CROSS_COMPILE=arm-openwrt-linux- menuconfig # 如果需要重新配置内核 make ARCH=arm CROSS_COMPILE=arm-openwrt-linux- vmlinux # 编译内核 ``` 注意:这里的`<arch>`、`<target>`和`<version>`需要根据实际替换。例如,用户之前命令中的路径是: `/opt/bba/EB230/bba_3_0_platform/sdk/an7563/lede/build_dir/target-arm_cortex-a7_musl_eabi/linux-airoha_en7563/linux-5.4.55` 所以,我们可以进入该目录,然后运行make命令,并指定ARCH和CROSS_COMPILE(注意,用户之前命令中使用的CROSS_COMPILE是`arm-openwrt-linux-muslgnueabi-`,但这里可能需要根据实际调整)。 5. **注意环境变量**: 在手动编译,需要确保环境变量(如ARCH和CROSS_COMPILE)设置正确,并且内核配置(.config)已经存在(通常由OpenWrt构建系统生成)。 6. **使用OpenWrt的顶层Makefile目标**: OpenWrt还提供了一个目标来准备内核树,以便我们可以手动编译: ```bash make target/linux/prepare ``` 这个目标会解压内核源码并应用补丁和配置,然后我们就可以进入内核目录进行编译。 7. **编译内核镜像**: 在手动编译内核,我们可以编译特定的目标,如`zImage`或`uImage`,这取决于平台。例如: ```bash make ARCH=arm CROSS_COMPILE=arm-openwrt-linux-muslgnueabi- zImage ``` 总结两种方法: - 方法一:使用OpenWrt的构建目标(如`make target/linux/install`)来编译内核,然后从构建目录中获取内核镜像。 - 方法二:进入内核构建目录,手动使用make命令编译,但需要正确设置ARCH和CROSS_COMPILE等参数。 由于用户之前已经有一个复杂的make命令用于编译模块,说明用户可能已经有一个配置好的OpenWrt构建环境。因此,推荐使用方法一,因为它更符合OpenWrt的构建流程。 但是,如果用户需要自定义内核配置或者进行调试,那么方法二更灵活。 下面给出一个具体的步骤示例(假设OpenWrt根目录为`/opt/bba/EB230/bba_3_0_platform/sdk/an7563/lede`): **方法一示例:** ```bash cd /opt/bba/EB230/bba_3_0_platform/sdk/an7563/lede make target/linux/install V=s ``` 编译完成后,内核镜像文件将出现在: ``` build_dir/target-arm_cortex-a7_musl_eabi/linux-airoha_en7563/image ``` **方法二示例:** ```bash cd /opt/bba/EB230/bba_3_0_platform/sdk/an7563/lede/build_dir/target-arm_cortex-a7_musl_eabi/linux-airoha_en7563/linux-5.4.55 # 确保配置存在(如果没有,可以从上级目录的.config复制过来,或者运行make menuconfig生成) cp ../.config .config # 或者使用OpenWrt生成的配置(通常已经存在.config) make ARCH=arm CROSS_COMPILE=arm-openwrt-linux-muslgnueabi- oldconfig make ARCH=arm CROSS_COMPILE=arm-openwrt-linux-muslgnueabi- zImage ``` 注意:方法二中,我们使用了`oldconfig`来确保.config中的配置都是最新的(如果有新的配置选项,会提示用户)。 最后,生成的内核镜像(zImage)位于`arch/arm/boot/zImage`。 请根据实际情况选择合适的方法。 相关问题: 1. OpenWrt中如何单独编译内核模块? 2. 如何将自定义内核镜像打包到OpenWrt固件中? 3. 如何配置OpenWrt的内核选项? 4. 交叉编译内核出现头文件错误如何解决? 5. 如何为OpenWrt添加内核补丁? 注意:在回答中,我们引用了OpenWrt构建系统的一般知识,没有具体引用某个文档,但根据OpenWrt的常见实践,这些步骤是通用的。</think>### OpenWRT 单独编译内核指南 在 OpenWRT 中单独编译内核需要理解其独特的构建系统结构。以下是详细步骤和原理: #### 一、OpenWRT 构建系统层级 OpenWRT 使用分层架构管理编译过程[^1]: ```mermaid graph TD A[顶层 Makefile] --> B[target/linux] B --> C[平台通用配置] B --> D[设备特定配置] D --> E[内核源码目录] ``` #### 二、单独编译内核步骤 1. **准备内核配置** ```bash cd <openwrt_root> # 生成默认配置 make target/linux/prepare # 进入内核配置界面 make kernel_menuconfig ``` 2. **手动编译内核** ```bash # 进入内核构建目录 cd build_dir/target-<arch>/linux-<platform>/linux-<version> # 应用OpenWRT配置 cp ../../../../../tmp/kernel-config .config make ARCH=arm CROSS_COMPILE=arm-openwrt-linux- oldconfig # 编译内核镜像 make ARCH=arm CROSS_COMPILE=arm-openwrt-linux- zImage ``` > 关键参数说明: > - `ARCH`: 目标架构 (arm/mips/x86等) > - `CROSS_COMPILE`: 交叉编译器前缀 > - `zImage`: ARM平台标准内核镜像格式 3. **获取编译结果** 编译完成后,内核镜像位于: ``` build_dir/target-<arch>/linux-<platform>/linux-<version>/arch/arm/boot/zImage ``` #### 三、高级编译选项 1. **定制内核特性** ```bash # 在 kernel_menuconfig 中启用特定功能 CONFIG_KPROBES=y # 启用动态追踪 CONFIG_DEBUG_FS=y # 启用调试文件系统 ``` 2. **优化编译参数** ```makefile # 在 target/linux/<platform>/Makefile 中添加 KERNEL_CFLAGS += -O3 -mcpu=cortex-a7 -mfpu=neon-vfpv4 ``` 3. **增量编译技巧** ```bash # 仅编译修改过的文件 make -C linux-<version> ARCH=arm CROSS_COMPILE=... SUBDIRS=drivers/usb ``` #### 四、常见问题解决 1. **配置丢失问题** **现象**:编译后配置被覆盖 **解决**:将最终配置保存到`target/linux/<platform>/config-<version>` 2. **模块签名错误** **修复**:在配置中禁用签名验证 ```config CONFIG_MODULE_SIG=n CONFIG_MODULE_SIG_ALL=n ``` 3. **设备树不匹配** **处理**:更新设备树源文件 ```bash make target/linux/<platform>/image/compile ``` #### 五、内核集成验证 编译后需验证内核是否兼容用户空间: ```bash # 检查内核模块ABI modinfo build_dir/.../module.ko | grep vermagic # 应显示:5.4.55 mod_unload modversions ARMv7 ``` > **重要提示**: > - 始终在OpenWRT构建环境内操作,避免工具链不匹配 > - 修改内核配置后需清理:`make target/linux/clean` > - 生产环境建议使用`CONFIG_DEBUG_INFO=n`减少镜像大小 --- ### 相关问题 1. 如何为OpenWRT内核添加自定义驱动模块? 2. 交叉编译内核出现"Invalid module format"错误如何解决? 3. OpenWRT中如何配置内核启动参数? 4. 如何为特定硬件平台优化OpenWRT内核性能? 5. OpenWRT内核升级后如何保留原有配置?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值