参考文档:.c文件如何编译为ko的MAKEFILE文件编写 - young525 - 博客园 (cnblogs.com)

文档组织结构

header目录:存放头文件

source目录:存放源文件

单个文件编译KO

在source目录中存放一个文件为kernel_simulator.c,下面的Makefile会编译该C文件,然后在source目录下生成一个kernel_simulator.ko。

KVERS = $(shell uname -r)

# 生成模块名
MODULE_NAME := kernel_simulator # 源文件目录
SRC_PATH := source/ # 作为一个模块进行编译
CONFIG_RUNYEE_CAMVIB=m # Kernel modules
obj-$(CONFIG_RUNYEE_CAMVIB) := $(SRC_PATH)$(MODULE_NAME).o # 指定模块的一些编译选项
EXTRA_CFLAGS=-g -O0 build: kernel_modules
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
CONFIG_RUNYEE_CAMVIB=m

注意上面的m,表示作为一个模块进行编译,最后在Makefile中需要用到的编译开关。

多个文件编译

在header目录存放一个:test_func.h

在source目录存放两个文件:test_func.c、kernel_simulator.c

通过以下Makefile可以在当前目录生成一个ksimulator.ko。

KVERS = $(shell uname -r)

# 生成模块名
MODULE_NAME := ksimulator # 源文件目录
SRC_PATH := source/ # 作为一个模块进行编译
CONFIG_TOUCHSCREEN_FOCALTECH=m # 指定头文件路径,和一些编译选项
EXTRA_CFLAGS += -I$(PWD)/header/
EXTRA_CFLAGS += -Werror
EXTRA_CFLAGS += -g -O0 # Kernel modules
obj-$(CONFIG_TOUCHSCREEN_FOCALTECH) += $(MODULE_NAME).o
$(MODULE_NAME)-objs := $(SRC_PATH)kernel_simulator.o
$(MODULE_NAME)-objs += $(SRC_PATH)test_func.o build: kernel_modules
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
CONFIG_TOUCHSCREEN_FOCALTECH=m

注意上面的m,表示作为一个模块进行编译,最后在MAKEFILE中需要用到的编译开关。

然后在相应的源码目录中的Makefile中添加如下语句:

$(MODULE_NAME)-objs := $(SRC_PATH)kernel_simulator.o
$(MODULE_NAME)-objs += $(SRC_PATH)test_func.o

上面的意思就是编译生成ko文件需要两个.c文件(kernel_simulator.c、test_func.c),最后生成名为ksimulator的ko文件。

注意ko文件名一定不能为kernel_simulator。那么在obj-m和$(MODULE_NAME)-objs中都含有kernel_simulator.o,对make来讲会产生循环和混淆,会报如下的错误:

make[2]: Circular /home/kernel/Kernel_Simulator/kernel_simulator.o <- /home/kernel/Kernel_Simulator/kernel_simulator.o dependency dropped.

基本知识

obj-m = *.o
obj-y = *.o

上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件。

使用obj-m方式:

使用obj-y方式:

一个或多个C文件编译KO的更多相关文章

  1. Linux内核驱动将多个C文件编译成一个ko文件的方法——每一个C文件中都有module_init与module_exit

    以两个C文件为例: 将本该被分别编译成adc_device.ko和adc_driver.ko的adc_device.c.adc_driver.c编译成一个ko文件! 採用方法: 第一步.改动C文件 1 ...

  2. Ubuntu的多文件编译以及c语言的数组、函数

    闲言少叙,直接切入主题. 一.Linux下的多文件编译(Ubuntu系统). 对于小程序来说,往往一个.c文件就足够了,里面包含了各种主函数和功能函数,以及函数的声明等等.但是这样的弊端主要有两点,一 ...

  3. [转]嵌入式SQC文件编译

      Src Url:http://blog.csdn.net/cws1214/article/details/12996351   A.预编译部分  1.预编译DB2篇 1.1 什么是DB2预编译 在 ...

  4. App_global.asax.pdb: 另一个程序正在使用此文件,进程无法访问。

    页面修改后,浏览报错,信息如下. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS0042: 创建调试信息文件“ ...

  5. OC方法和文件编译

    OC方法和文件编译 一.OC方法 (一)对象方法 (1)对象方法以-开头如 -(void)xx; (2)对象方法只能又对象来调用 (3)对象方法中可以访问当前对象的成员变量 (4)调用格式   [对象 ...

  6. C语言-------多文件编译

    (1)前段时间,学长讲解宏的一些知识  也提起了那个多文件编译,同过看别人的博客,自己也懂了一些,现在来总结一下这个多文件编译,其实和java里面的那个class的调用好像有联系 其定义即可以理解成: ...

  7. linux kernel 模块多文件编译

    /*************************************************************************** * linux kernel 模块多文件编译 ...

  8. ios开发问题:添加库和复制其它工程文件编译错误问题

    首先添加库问题: 选择页签Build Phases->Link Binary With Libraries点+添加库 然后command+shift+k清除历史debug的垃圾 复制其它工程文件 ...

  9. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  10. LINUX下文件编译

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

随机推荐

  1. Python Flask获取iOS的UDID

    测试iOS app时候,我们可以安装以下4种类型的包 : AdHoc                 -- 一般为正式环境验证AppStore             -- 上传AppStore,只有 ...

  2. C内存操作API的实现原理

    我们在编写C代码时,会使用两种类型的内存,一种是栈内存,另外一种是堆内存,其中栈内存的申请和释放是由编译器来隐式管理的,我们也称为自动内存,这种变量是最简单而且最常用的,然后就是堆内存,堆的申请和释放 ...

  3. 《Effective C#》系列之(二)——如何使代码易于阅读和理解

    在<Effective C#>这本书中,使代码更易于阅读和理解是其中一章的主要内容.以下是该章节的一些核心建议: 使用清晰.有意义的名称:变量.方法.类型等的名称应该能够准确地描述其含义, ...

  4. 融合数据库生态:利用 EventBridge 构建 CDC 应用

    简介: 近期,EventBridge 事件流已经支持了基于阿里云 DTS服务的 CDC 能力.本文将从 CDC.CDC 在 EventBridge 上的应用以及若干最佳实践场景等方面,为大家介绍如何利 ...

  5. 双龙贺岁,龙蜥 LoongArch GA 版正式发布

    ​简介:Anolis OS 8.4 LoongArch 正式版发布产品包括 ISO.软件仓库.虚拟机镜像.容器镜像. ​ 简介 继  Anolis OS LoongArch 预览版发布后,现迎来龙蜥 ...

  6. [FAQ] chrome.runtime.onMessage 问题, Unchecked runtime.lastError: The message port closed before a response was received

    // quasar background-hook.js chrome.runtime.onMessage.addListener(function (request, sender, sendRes ...

  7. 2019-11-29-如何入门-C++-AMP-教程

    title author date CreateTime categories 如何入门 C++ AMP 教程 lindexi 2019-11-29 08:20:37 +0800 2018-2-13 ...

  8. vue-公共组件的注册

    注册公共组件,在每个需要的页面直接输入文件名(<g-table/>)即可引用该组件 步骤: 1.新建components/global文件夹,以及components/global/g-t ...

  9. vue点击旋转,再点击复原

    效果: 1.html.通过绑定t值控制不同的class名, 原图是右边方向的箭头 <img class="right" v-if="item.t" src ...

  10. SpringBoot的@Resource和@Autowired+@Qualifier使用

    1.区别 参考: https://blog.csdn.net/xhbzl/article/details/126765893 https://blog.csdn.net/qq_40263124/art ...