linux编译模块,包含了头文件却还是报undifind警告
在编写一个自己写的gadget驱动的时候遇到一个这样的问题,编译的时候报了个警告:WARNING: "usb_composite_register" […/my_zero.ko] undefined!
告诉我这个函数没有定义,但是生成了ko文件,将这个文件拷贝到开发板目录下insmod,同样也是报这是一个未知的符号:
通常这种问题是因为没有包含函数头文件,这个函数是在linux/usb/composite.c中定义的,在composite.h中声明,因此包含linux/usb/composite.h就可以了…吗?事实上我已经包含了这个头文件。
这个时候我想到了光包含头文件不行啊,还要编译源文件啊。不过我似乎发现一个很奇怪的问题,那就是要编译源文件似乎是理所当然的,但问题是之前写驱动调用的那些函数也没有把它们的源文件放进来编译啊。比如说最开始写驱动的时候一定调用过printk,这个函数在printk.c中定义,但也没见哪条语句指定要把printk.c拿进来编译啊。
查找资料过后发现原来是EXPORT_SYMBOL搞的鬼,就是说使用EXPORT_SYMBOL导出的函数可以被其他内核模块使用,那这是不是说,把usb_composite_register这个函数用EXPORT_SYMBOL导出就可以了呢。我们在内核代码中usb_composite_register这个函数后面用EXPORT_SYMBOL将其导出,然后编译自己的模块,发现还是报相同的警告。难道要重新编译一下内核吗,于是我重新编译了内核,编译内核时它警告我usb_composite_register这个函数在g_serial.o中已经被导出了,但这是一个警告,我想问题应该不大。接下来再编译自己的模块,它就不报警告了。
既然和重新编译内核有关,那自然也要下载新编译的内核了,将新的内核下载进开发板后再insmod我编译的ko文件,结果还是报Unknown symbol usb_composite_register。
再查过资料后发现还有一个关键点我没做到,那就是必须先insmod包含要导出的函数的模块,然鹅查找了composite.c这个文件后发现这个文件里没有module_init,就意味着这不是一个独立的模块,也就没法“先insmod包含要导出的函数的模块”。
连源文件都给了,难道还调不了函数了吗,这怎么可能。我们可以看看内核文件里其他模块都是怎么做的,找到其他的gadget驱动文件,发现他们都比较流弊,是直接#include “composite.c”,直接把c文件包含进来了。这里可能有些朋友比较蒙圈(“只见过包含.h,没见过包含.c啊”),其实只要清楚#include的机制就能理解了。#include的作用是将包含的文件在使用#include处展开,不管是包含.c还是包含.h,都是将被包含的文件里的内容在包含处展开,相当于把被包含的文件里的内容全部复制下来,在#include处粘贴一样。
既然这样,那我也包含composite.c这个文件试试,先将composite.c复制到我自己的驱动目录下,结果一编译又报出几个警告:
那自然的要把包含这些函数的.c文件拿过来编译。发现这几个函数分别是在epautoconf.c、config.c和usbstring.c中定义的,把这些文件拷贝到自己的工作目录下,同时在c文件中包含它们,再编译又报一个找不到gadget_chips.h的错,把这个文件再拷贝到工作目录中,再编译。
最后将生成的ko文件拷贝到开发板工作目录中,再insmod就可以了。
如果嫌把这些文件都拷贝过来太麻烦的话,可以直接在内核代码目录下加入自己的模块,参见:https://www.cnblogs.com/Suzkfly/p/11765883.html
linux编译模块,包含了头文件却还是报undifind警告的更多相关文章
- linux 编译指定库、头文件的路径问题(转)
1. 为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得 ...
- Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50
Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50 分类: 系统运维 查找包含BOM头的文件,命令如下: 点击(此处)折叠或打开 grep -r -I -l ...
- C预编译, 预处理, C/C++头文件, 编译控制,
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- 编写linux驱动所用到的头文件(转)
转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include < ...
- linux 中常用的一些头文件
#include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件. #include <asm/***.h> 是在linux ...
- gcc/clang编译带pthread.h头文件的源码时需要的参数
今天敲了一个小程序,编译时出现错误:undefined reference pthread_create 原来由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a, ...
- [C++] C语言及C++语言中包含的头文件名称,及作用
头文件主目录include 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下,具体的作用和所包 ...
- cocos2dx中使用声音引擎需要包含的头文件
1.需要包含的头文件和命名空间 #include "SimpleAudioEngine.h"using namespace CocosDenshion;
- 不包含SDK头文件, 补全API定义
/// @file main.cpp /// @brief 不包含SDK头文件, 补全API定义 #ifdef __cplusplus extern "C" { #endif /* ...
随机推荐
- 每日CSS_发光文本效果
每日CSS_发光文本效果 2020_12_22 源码 1. 代码解析 1.1 html 代码片段 <h1> <span>今</span> <span>天 ...
- 最速下降法--MATLAB程序
function x = fxsteep(f,e,a,b)x1 = a;x2 = b;Q = fxhesson(f,x1,x2);x0 = [x1,x2]';temp = [x0];fx1 = dif ...
- 实用干货!Java开发企业级权限管理系统视频教程
全程手把手带你运用Java技术栈,打造一套基于最流行的RBAC拓展模型的,分布式的,有界面的,高灵活性,高拓展性的企业级权限管理系统.学完本课程你将可以轻松应对绝大多数企业开发中与权限管理及后台系统相 ...
- 深入理解MySQL系列之锁
按锁思想分类 悲观锁 优点:适合在写多读少的并发环境中使用,虽然无法维持非常高的性能,但是在乐观锁无法提更好的性能前提下,可以做到数据的安全性 缺点:加锁会增加系统开销,虽然能保证数据的安全,但数据处 ...
- java中io流实现文件上传下载
新建io.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- 【目标检测】基于传统算法的目标检测方法总结概述 Viola-Jones | HOG+SVM | DPM | NMS
"目标检测"是当前计算机视觉和机器学习领域的研究热点.从Viola-Jones Detector.DPM等冷兵器时代的智慧到当今RCNN.YOLO等深度学习土壤孕育下的GPU暴力美 ...
- 如何在K8S中优雅的使用私有镜像库 (Docker版)
前言 在企业落地 K8S 的过程中,私有镜像库 (专用镜像库) 必不可少,特别是在 Docker Hub 开始对免费用户限流之后, 越发的体现了搭建私有镜像库的重要性. 私有镜像库不但可以加速镜像的拉 ...
- MySQL索引优化,explain详细讲解
前言:这篇文章主要讲 explain 如何使用,还有 explain 各种参数概念,之后会讲优化 一.Explain 用法 模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理 ...
- 定期删除文件夹中的文件——C#
下面是自定义的一个函数,参数分别为:文件夹名称.文件后缀.保存天数 逻辑是获取当前系统的时间,和文件创建时间去作差,如果结果大于保存天数,就删除它 /// <summary> /// 定期 ...
- JAVA_基础IO流随机存取文件流(四)
随机存取文件流 RandomAccessFile 声明在java.io包下,但直接继承于java.lang.Object类.并 且它实现了DataInput.DataOutput这两个接口,也就意味着 ...