学校实验,使用的华清远见,VMworkstation+Ubuntu14.04-64位
内核版本3.16-generic,toolchain-4.4.6
环境是学校试验箱配套的华清远见Ubuntu虚拟机镜像,在完成基本环境配置后,开始的实验。
此部分实验主要是驱动移植准备阶段,需要编译例程提供的ex代码,代码就不具体贴了。
由于我使用的自己的电脑,VM有点问题,无法配置share文件夹,虚拟机中显示不出来,但tools正常安装。于是,采用的是直接拖拽的方式,将电脑的文件拖到虚拟机中。
使用cd、ls、make clean,对ex2文件夹下的文件直接执行make操作,报错。
在经过百度大学、咨询同学、直接拷贝完成了的镜像,连续几天的战斗中,最后无奈又好笑的解决了。
此处为提供给可能遇到同样问题的人一个解决方法和方法,完整将实验遇到的报错、问题、思路、解决方案贴出。
进入ex2文件夹,首先执行了make clean,此处与成功编译的其他虚拟机相同。
紧跟着执行make,出现 Error 2。
include/uapi/asm-generic/int-ll64.h:11:29: fatal error: asm/bitsperlong.h: No such file or directory
#include <asm/bitsperlong.h>
^
compilation terminated.
make[2]: *** [/home/linux/Desktop/ex2-init-exit/hello.o] Error 1
make[1]: *** [_module_/home/linux/Desktop/ex2-init-exit] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.16.0-30-generic'
make: *** [modules] Error 2
基本问题是 “int-ll64.h” 文件,include的头文件报错。
经过查询百度,相关的经验提供了将“int-ll64.h”定位到include<asm/bitsperlong.h>修改为<asm-generic/bitsperlong.h>,后便可编译通过。
实测,此方法确实可行,此后make产生的错误,相关asm无法找到文件,都可以通过asm-generic修改来解决。
个人理解是由于内核公版问题,编译器自动对应的库名问题。
经过约十几个asm报错,都通过类似方法解决。但紧跟着出现了一个“变量隐式声明”的错误+asm-generic修改后无法找到文件,此时出现3个Error。(由于未保留有截图,无法完整复现错误声明)
“变量隐式声明”的错误:
rwsem.h:45:3: error: implicit declaration of function 'cmpxchg'
此部分定位到的函数是一段for循环体下,一个变量名。
此时,本人考虑通过更换编译器版本与升级内核的方式解决,但最终的解决方法让人哭笑不得。
在经过将近两天的奋斗,这个问题还是没有跳出来,主要是由于更换3.7内核的时候,需要选择system type,但这个虚拟机是配套提供的。综合考虑,还是最终选择去完成了的电脑中,拷贝一个新的镜像。(虽然,现镜像也是从这台电脑中拷贝,且配置环境过程一样)
拷贝的电脑已经完成了ex2的编译,但我重新拖拽ex2文件夹到虚拟机中,相同的步骤仍然报相同的错误。
在比对的两个电脑差异后,发现唯一的不同是文件目录不同,以及发送到虚拟机的方式不同。
原电脑是采用共享文件夹,直接操作,而我的电脑是采用拖拽、桌面make。
在排除拖拽产生文件损坏的问题后,尝试将文件夹复制到mnt/hgfs下进行编译。
此时,终端报了权限错误!
我敏感的感觉到会不会是权限问题(但之前从未认识到make需要超级管理员权限才可以执行)。
此时,我在不改变位置,原文件夹下,直接输入sudo make……编译过了……
此时我仍十分无法理解,sudo make和make的区别。从此错误来看,应该是sudo make采用了不同的库文件进行编译,但无法理解为何出现这种情况。
经过百度后,发现在15年就有网友提出过相同问题,其在root权限下,直接执行make报错,但sudo make就正常编译。这比我遇到的问题更加奇异。
http://www.openedv.com/posts/list/56860.htm
期待大神……