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 /* ...
随机推荐
- NET Core 使用EF Core的Code First迁移和DBFirst
DBFirst (1)Microsoft.EntityFrameworkCore (2)Microsoft.EntityFrameworkCore.Design (3)Microsoft.Entity ...
- 解决[BScroll warn]: Can not resolve the wrapper DOM. Vue better-scroll
在开发项目过程中,使用better-scroll插件中遇到了滚动一次重复提示相同错误 [BScroll warn]: Can not resolve the wrapper DOM. Vue bett ...
- Java 类型转换精度问题
基本数据类型占用内存大小 最近项目中修复了一个关于类型转换精度丢失的问题,以前对于类型转换会丢失精度只知其然,不知其所以然,这次了解了下相关原理,也分享给大家.先来回顾一下 Java 的基本数据类型中 ...
- [leetcode]168. Excel Sheet Column Title表格列名编码(十进制和多进制相互转换)
其实就是一道,十进制转多进制的题 十进制转多进制就是从后边一位一位地取数. 这种题的做法是,每次用n%进制,相当于留下了最后一位,然后把这位添加到结果最前边.结果需要转为进制的符号. 下一次循环的n变 ...
- Linux嵌入式学习-交叉编译openssl
利用arm-none-linux-gnueabi-gcc交叉编译openssl,生成静态库文件libcrypto.a ,libssl.a 1.从openssl官网下载openssl最新版本,我下载的是 ...
- [leetcode]297. Serialize and Deserialize Binary Tree一般二叉树的编解码
由于一般的前序遍历不能唯一的还原出原本你的二叉树,所以要改变一下: 记录二叉树的结构信息,也就是空节点用符号表示 一般的前序遍历只是记录了节点的前后顺序,通过记录空节点,每一层的结构就可以记录下来 解 ...
- FPT: Feature Pyramid Transfomer
导言: 本文介绍了一个在空间和尺度上全活跃特征交互(fully active feature interaction across both space and scales)的特征金字塔transf ...
- 24位PCM采样数据转成16位算法,已实现PCM转WAV在线工具源码支持24bits、16bits、8bits
目录 算法来源 js版24位PCM转8位.16位代码 js版8位.16位PCM转成24位 附:浏览器控制台下载数据文件代码 相关实现 最近收到几个24位的PCM录音源文件,Recoder库原有的PCM ...
- java中string、stringBuild、stringBuffer的区别
(1)string 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承.是不可变对象,一旦创建,就不能修改它的值. 3,对于已经存在的Sti ...
- java 多态 向上造型
最近在读java 编程思想,在读多态一章时,遇到了一个问题,在此记录一下. 1 package main.demo; 2 3 class Super{ 4 public int filed =0; 5 ...