Linux内核编译时warning被当作error处理的解决办法

2024-03-17 06:10

本文主要是介绍Linux内核编译时warning被当作error处理的解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前提:

Linux 之父 Linus Torvalds 更改了用于编译内核的 makefile,所有内核构建将默认启用“-Werror”编译器标记, 该代码已合并到 Linux 5.15 内核中,Linus Torvalds表示:“我们真的需要一个干净的编译环境。”

在需要将驱动增加到内核中时,可能会遇到原始代码中粗糙有很多warning的情况。内核的顶层Makefile又有-Werror的编译规则,这种情况有三种解决办法:


解决方法:

  1. 通过逐步的清除warning解决问题
  2. 通过修改顶层Makefile去掉-Werror躲避问题
  3. 通过在报错的源代码中添加代码诊断规则躲避问题

说明:

下面对三种方法进行说明:

  1. 内核编译规则把 warning 当做错误,会中断编译,强制我们修复问题。在没有开启这个功能的时候,warning 会随着开发不断积累增多。当数量很多的时候,新增的 warning 不容易被发现,从而掩盖问题。 对于一个自律的独立开发者,这个问题是可以避免的。
  2. 在顶层的Makefile中有对-Werror的调用,如果要解决这个问题,删掉Makefile中所有的-Werror即可。
  3. 在源代码文件中诊断(忽略/警告)
    语法:
    #pragma GCC diagnostic [error|warning|ignored] "-W<警告选项>"
    诊断-忽略:(关闭警告)
    #pragma  GCC diagnostic ignored  "-Wunused"
    #pragma  GCC diagnostic ignored  "-Wunused-parameter"
    诊断-警告:(开启警告)
    #pragma  GCC diagnostic warning  "-Wunused"
    #pragma  GCC diagnostic warning  "-Wunused-parameter"
    诊断-错误:(开启警告-升级为错误)
    #pragma  GCC diagnostic error  "-Wunused"
    #pragma  GCC diagnostic error  "-Wunused-parameter"
    用法:
    在文件开头处关闭警告,在文件结尾出再开启警告,这样可以忽略该文件中的指定警告.
    示例:
    #pragma GCC diagnostic push										// 记录当前诊断状态
    #pragma GCC diagnostic ignored "-Wdeclaration-after-statement"	// 忽略C90 不允许混合使用声明和代码警告
    #pragma GCC diagnostic ignored "-Wunused-function"				// 忽略定义的函数不使用警告
    #pragma GCC diagnostic ignored "-Wunused-variable"				// 忽略unused-variable警告
    #pragma GCC diagnostic ignored "-Wunused-but-set-variable"		// 忽略unused-but-set-variable警告
    #pragma GCC diagnostic ignored "-Wdesignated-init"				// 忽略结构体未初始化警告
    #pragma GCC diagnostic ignored "-Wincompatible-pointer-types"	// 忽略强制正确使用指针警告
    #pragma GCC diagnostic ignored "-Wdate-time"					// 忽略禁止使用日期/时间宏警告
    //受编译规则约束编译的代码
    #pragma GCC diagnostic pop									// 恢复诊断状态

这篇关于Linux内核编译时warning被当作error处理的解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818058

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境