OPENWRT+中添加动态库和静态库.so和.a

来源:互联网 发布:淘宝可以实名认证几个 编辑:程序博客网 时间:2024/05/22 14:21

有的时候,需要在openwrt工程中添加这样或者那样的库。例如静态库和动态库

然后其他模块会调用它们。

现在记录下分别创建动态库和静态库的方法.


前面已经讲过了,在openwrt 中添加工程的方法。这里方法类似.

首先,创建Makefile和src文件夹。并将自已的源码放入。

然后修改Makefile

现帖出外层(供openwrt 使用的Makefile和内供源码使用的Makefile)

include $(TOPDIR)/rules.mk

PKG_NAME:=libcusflash --库的名称
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)  --一些定义条件,根据自已的要求,添加,非必要
PKG_KCONFIG:=RALINK_MT7620 RALINK_MT7621 RALINK_MT7628
PKG_CONFIG_DEPENDS:=$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_$c),CONFIG_$(c)))

include $(INCLUDE_DIR)/package.mk -包含规则
include $(INCLUDE_DIR)/kernel.mk

define Package/libcusflash 
  SECTION:=MTK Properties  下面这两个就是openwrt中的make menuconfig出来后,各个选项条目了。它是根据所有Makefile中的此处生成的。
  CATEGORY:=MTK Properties
  TITLE:=Custom cusflash library --注解
  SUBMENU:=Appcustom    --子选面。意为在CATEGORY下面的子目录。即:MTK Properties->Appcustom->libcusflash
endef

define Package/libcusflash/description --此处非必要,为了保持格式一致
  Custom cusflash library
endef

define Build/Prepare         --将源码copy到编译路径。即build_dir/target-XXXXX/下面,进行编译
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef

TARGET_CFLAGS += \
$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_$c),-DCONFIG_$(c))) --添加CFLAGS

define Build/Configure
endef

define Build/InstallDev                                            --此处,是安装动态库的环镜。它会将生成的头文件和库,copy到staging_dir\target-mipsel_24kec+dsp_uClibc-0.9.33.2\ 此级目录下。此处是给后续需要它的库指明路径。如果你的工程中会用到这个库,则需要添加头文件路径,即这个路径
mkdir -p $(1)/usr/include
$(CP) $(PKG_BUILD_DIR)/libcusflash.h $(1)/usr/include/
mkdir -p $(1)/usr/lib
$(CP) $(PKG_BUILD_DIR)/lib*.so $(1)/usr/lib/
endef

define Package/libcusflash/install                         --将生成的库文件,copy到文件系统对应的目录下。即板子上面的/usr/lib 中
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_BIN) $(PKG_BUILD_DIR)/*.so $(1)/usr/lib
endef

$(eval $(call BuildPackage,libcusflash))


上面这个就是外层openwrt的Makefile 。下面贴一下内层源码的Makefile

EXEC = libcusflash.so --目标
SRC = libcusflash.c libanalysis.c


CFLAGS += -fPIC
LDFLAGS += -shared   --动态库编译选项


all: $(EXEC)        --目标及规则
$(EXEC): $(SRC)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SRC) $(LDLIBS)


clean:
-rm -f $(EXEC) *.elf *.gdb *.o *.so


以上为动态库的Makefile .静态库的外层Makefile和动态库的一样。照般就是了。

内层源码Makefile稍有不同:去掉-shared选项,并将.c编译成.o过行链接就OK了。

EXEC = libcusat.a
OBJS=cusat_tok.o 

CFLAGS += -fPIC -c -Wall

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<

$(EXEC): $(OBJS)
$(AR) curv $(EXEC) $(OBJS)


all: $(EXEC)

clean:
-rm -f $(EXEC) *.elf *.gdb *.o *.a


以上为动态库和静态库的添加方法。

如果以后,某个工程需要用到这些库的时候。则我们直接修改该工程的内外层Makefile即可.

1.外层Makefile:

define Package/opcusflash
  SECTION:=MTK Properties
  CATEGORY:=MTK Properties
  TITLE:=Command to config opcusflash
  SUBMENU:=Appcustom
  DEPENDS:=+libcusflash --此处,增加库的依赖头系
endef

2.内层Makefile:

CFLAGS += -I$(STAGING_DIR)/usr/include/ --添加头文件路径(动态库非必须)


all: $(EXEC)
$(EXEC): $(SRC)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SRC) $(LDLIBS)-lcusflash --指明要链接的库

1 0