把 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)
外,其他变量值主要来源于include
的Makefile.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/include
和common
这两个头文件路径,就可以进行相对独立的开发了。