在具体的工程实践中,可能因为种种的原因无法重新编译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")