把 MPP Sample 编译成动态库

MPP文件结构

mpp
    \ component 开发摄像头isp图像算法
    \ ko 一些编译好的或存放待编译的驱动模块
    \ lib 媒体框架api库
    \ sample 媒体应用开发示例 一般做媒体应用开发直接到sample中,套用文件组织结构就可以了
    \ tools 调用api的工具例子
sample
    \common 公共源文件,媒体开发一般都会包括这些
    \venc 一个视频流编码的例子工程,其他例子不再列出
        \Makefile 用于设定自定义的编译参数值,也并没有具体的编译规则
    \ Makefile 这个文件并没有实质编译规则内容,主要起到选择编译那个文件夹的作用,如果添加了自己的文件夹,直接相应添加即可。
    \Makefile.param 这个是全局的默认编译参数,适用于同路径下的所以工程,通常要被工程文件下的Makefile首先包含
    \up_linux.mak 这个就是编译规则文件,也用于同路径下的所以工程,通常由工程文件下的Makefile最后包含

分析编译规则

规则关键语句如下

$(TARGET):$(COMM_OBJ) $(OBJS)
	@$(CC) $(CFLAGS) -lpthread -lm -o $(TARGET_PATH)/$@ $^ -Wl,--start-group $(MPI_LIBS) $(SENSOR_LIBS) $(AUDIO_LIBA) $(REL_LIB)/libsecurec.a -Wl,--end-group

其中$(COMM_OBJ)为公共源文件的.o文件(源码路径./common),$(OBJS)为工程目录中Makefile指定的源文件,也就是自己的工程代码,除了这个变量和$(TARGET)外,其他变量值主要来源于includeMakefile.param中的代码。这行规则主要是把所有的公共文件和工程文件编译成应用程序, -Wl,--start-group用于指定连接的静态库,$(CFLAGS)指定编译选项。

这些工程Makefile中都通过include相对路径相互联系,只要套用这个工程文件组织架构添加工程编译就不会有错。但当开发资料在外部保存,并不放到这个文件结构里,那么把mpp这堆东西编译成动态库好了。

编写编译规则

在sample路径下新建目录buildso,并新建Makefile填如下内容

include ../Makefile.param

TARGET := libmpp.so
TARGET_PATH := .

CFLAGS += $(COMM_INC)

.PHONY : so clean
so: $(TARGET)
$(TARGET):$(COMM_OBJ)
	$(CC) -fPIC -shared $(CFLAGS) -o $(TARGET_PATH)/$@ $^ -Wl,--start-group $(MPI_LIBS) $(SENSOR_LIBS) $(AUDIO_LIBA) $(REL_LIB)/libsecurec.a -Wl,--end-group

clean:
	@rm -f $(TARGET_PATH)/$(TARGET)
	@rm -f $(OBJS)
	@rm -f $(COMM_OBJ)

这里还是需要通过include ../Makefile.param取获取一些默认的参数值,当mpp完成配置并编译成库动态库后,mpp对于自己的工程就是一个独立外部组件,只要配置好交叉编译工具链,指定一下mpp/includecommon这两个头文件路径,就可以进行相对独立的开发了。

posted @ 2021-02-24 20:34  派大海星  阅读(319)  评论(0编辑  收藏  举报