在编写一个自己写的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警告的更多相关文章

  1. linux 编译指定库、头文件的路径问题(转)

    1. 为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得 ...

  2. Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50

    Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50 分类: 系统运维 查找包含BOM头的文件,命令如下: 点击(此处)折叠或打开 grep -r -I -l ...

  3. C预编译, 预处理, C/C++头文件, 编译控制,

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  4. 编写linux驱动所用到的头文件(转)

    转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include < ...

  5. linux 中常用的一些头文件

    #include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件. #include <asm/***.h> 是在linux ...

  6. gcc/clang编译带pthread.h头文件的源码时需要的参数

    今天敲了一个小程序,编译时出现错误:undefined reference pthread_create 原来由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a, ...

  7. [C++] C语言及C++语言中包含的头文件名称,及作用

    头文件主目录include 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下,具体的作用和所包 ...

  8. cocos2dx中使用声音引擎需要包含的头文件

    1.需要包含的头文件和命名空间 #include "SimpleAudioEngine.h"using namespace CocosDenshion;

  9. 不包含SDK头文件, 补全API定义

    /// @file main.cpp /// @brief 不包含SDK头文件, 补全API定义 #ifdef __cplusplus extern "C" { #endif /* ...

随机推荐

  1. angular8 大地老师学习笔记

    第一课: angular 创建项目命令: ng new 项目名称 创建组件: ng g 可查看所有创建的对象  ,ng g component  components/home  创建组件,后面跟的是 ...

  2. Python进阶——什么是描述符?

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 在 Python 开发中,你可能听说过「描述符」这个概念,由于我们很少直接使用它,所以大部分开发人员 ...

  3. 怎样用Python自制好看的指数估值图

    对于以定投指数的方式理财的朋友,最需要关注的指标便是各个指数的估值,在指数低估时买入,高估时卖出,那如何制作一张估值图来跟踪指数的估值情况呢?本文就从0到1介绍如何用 Matplotlib 画一张漂亮 ...

  4. Tensorflow Windows安装

    操作系统: Windows 7 安装步骤 Step 1: 安装Tensorflow支持的Python版本,配置环境变量 目前,Tensorflow支持: Python 3.5.x 64-bit fro ...

  5. Python朗读excel中的英文单词

    安装win32com的时候出现了诸多问题,直接贴代码: 1 ''' 2 #利用python朗读excel里面的单词 3 ''' 4 5 #开始导入所需库 6 import xlrd 7 from bs ...

  6. iOS 自定义tabBarController(中间弧形)

    效果图 1.在继承自UITabBarController的自定义controller中调用以下方法(LZCustomTabbar为自定义的tabbar) - (void)viewDidAppear:( ...

  7. 本地H5模式写的APP体验可以比APP还好

    很多APP使用H5编写,但APP链接的是远程的url的模式,导致了APP的用户体验极差,因为当你使用远程的H5 url的时候,打开H5页面的速度由网络决定,而不是由手机性能决定,假如用户在没有网络的地 ...

  8. Kafka数据每5分钟同步到Hive

    1.概述 最近有同学留言咨询Kafka数据落地到Hive的一些问题,今天笔者将为大家来介绍一种除Flink流批一体以外的方式(流批一体下次再单独写一篇给大家分享). 2.内容 首先,我们简单来描述一下 ...

  9. JavaSwing 船只停靠管理可视化(三)

    JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing 船只停靠管理可视化(三) JavaSwing 船只停靠管理可视化(四) JavaSwin ...

  10. python实现贴吧顶贴机器人

    前言------百度贴吧流量如何?全球最大的中文社区,虽然比不上阿里,腾讯! 此文章仅供交流学习.建议机器人用小号操作,切勿用作商业用途! 测试版本:python 3.7 64位火狐浏览器firefo ...