Android深度探索第八章
C或C++语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中的函数,extern的作用就是告诉编译器该函数的函数名、参数个数、参数类型和返回值类型。这些信息对于将a.c编译成a.o已经足够了。等到将a.o,b.o链接成可执行的文件或程序库时,编译器再到b.o中寻找函数的具体实现。也就是说,extern只在编译阶段起作用。除此之外,还可以使用b.h中定义b.c中的函数,然后在a.c中包含b.h文件。对于有些C/C++编译器,可以省略extern关键字。
整合各个文件组成Linux驱动,编写Makefile文件是最关键的一步。如果Linux驱动只有一个源代码文件,obj-m变量的值可以和源代码文件同名。如果Linux驱动包含多个文件,就需要使用module-y来指定所有的目标文件。而不能只指定被引用的目标文件。
在某些情况下,可能程序会出现异常情况,这时Linux驱动可能会无法正常的卸载。可以通过重启模拟器或开发板,动态Linux模块就可以从内存中卸载。但如果每次无法卸载驱动都需要重启机器,那就太过于麻烦了。当然不是所有的奔溃都可以解决只有初始化函数奔溃或卸载函数被阻塞才有一定的方法解决。