以动态库的形式编写linux驱动

  在具体的工程实践中,可能因为种种的原因无法重新编译linux内核,此时嵌入式工程师可以通过linux的API编写驱动代码,并将驱动以动态库的形式呈现给上层开发人员。本文提供一个工程实例的框架,来实现linux动态库的编译和装载。

一、创建工程文件夹目录

  首先创建lib文件夹存放整个工程的文件,然后在lib文件夹下创建project文件夹存放工程的源文件,再创建obj文件夹存放工程的编译文件。

二、创建编译文件

  1、首先在lib文件夹下创建如下三个文件:
  ①、build文件,控制编译和装载的shell脚本文件。
  ②、Makefile文件,编译文件。
  ③、readme文件,说明文件。
  2、在project文件夹下创建mytest.h文件。此文件里面声明的函数即为动态库暴露给上层的API函数。

三、编写lib/Makefile文件

CROSS_COMPILE 	?= 
TARGET		  	?= My_Test         #工程名称


RELYLIB			?=-lpthread                    #编译时依赖的库,示具体情况添加

CC 			:= $(CROSS_COMPILE)gcc
LD			:= $(CROSS_COMPILE)ld


INCDIRS 		:= project \                  #源文件目录

				   			   
SRCDIRS			:= project \                 #源文件目录

				   
INCLUDE			:= $(patsubst %, -I %, $(INCDIRS))

SFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

SFILENDIR		:= $(notdir  $(SFILES))
CFILENDIR		:= $(notdir  $(CFILES))

SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS			:= $(SOBJS) $(COBJS)

VPATH			:= $(SRCDIRS)

.PHONY: clean
	
$(TARGET).so : $(OBJS)
	$(CC) -o $@ -shared $(RELYLIB) $^



$(SOBJS) : obj/%.o : %.S
	$(CC) -Wall -nostdlib -fPIC $(RELYLIB) -c -O2  $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -fPIC $(RELYLIB) -c -O2  $(INCLUDE) -o $@ $<
	



clean:
	rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).so $(COBJS) $(SOBJS)

	

四、编写lib/build文件

  build文件控制Makefile文件的编译和装载。

#!/bin/bash
sudo make clean
sudo make TARGET=My_Test					#工程名称

#此处可示具体情况添加gcc编译器

sudo cp My_Test.so /usr/lib					#将库文件拷贝到系统的/usr/lib下
sudo mv My_Test.so ./obj					#将库文件剪切进obj文件夹下
cd project
sudo cp mytest.h /usr/include				#将包含的头文件拷贝到系统的/usr/include下
#ls

五、编写readme文件

5.1、部署方法

  进入lib文件夹下,输入:

sudo ./build

5.2、使用方法:

5.2.1、C语言方法:

  在文件中包含头文件#include<mytest.h>即可直接使用API
  编译时加入-lMy_Test即可

5.2.2、python语言方法

	import ctypes
	lib=ctypes.cdll.LoadLibrary("/usr/lib/My_Test.so")

猜你喜欢

转载自blog.csdn.net/xxxx123041/article/details/120470371