鸿蒙(OpenHarmony)编译移植第三方库ffmpeg

本文非官方教程,纯属业余折腾

官方教程链接:https://device.harmonyos.com/cn/docs/develop/transplant/transplant-thirdparty-makefile-0000001064218672

一、文件准备

1. ffmpeg源码下载(本文用的n4.4)

https://github.com/FFmpeg/FFmpeg/tags

2. 官方sysroot和llvm下载

    sysroot目录: 克隆仓库并切到OpenHarmony-v2.2-Beta分支
git clone git@gitee.com:openharmony/prebuilts_lite_sysroot.git --branch OpenHarmony-v2.2-Beta
    编译器: llvm
wget https://repo.huaweicloud.com/harmonyos/compiler/clang/10.0.1-62608/linux/llvm.tar.gz -O ./llvm.tar.gz

3. 编译工具说明

    关于sysroot目录,用到2个文件夹,内含平台相关的基础库,参与编译时使用-I和-L配置到cflags
sysroot/usr/include/arm-liteos sysroot/usr/lib/arm-liteos
    llvm常用到的几个工具
llvm/bin/clang // 相当于我们熟悉的gcc llvm/bin/clang++ llvm/bin/llvm-ar llvm/bin/llvm-as llvm/bin/llvm-nm llvm/bin/llvm-strip llvm/bin/llvm-ranlib llvm/bin/llvm-objdump llvm/bin/ld.lld
    llvm作为编译器自带两个库目录,内涵基础c/c++库,同样使用-I和-L配置到cflags
llvm/include llvm/lib
    最后是官方提到的配置项,也添加到cflags,这里的OHOS_ROOT_PATH当然就是上面clone下载的sysroot目录啦
–target=arm-liteos -march=armv7-a --sysroot=$(OHOS_ROOT_PATH)

二、编译

1. 文件准备如图

2. 编写 Makefile

ROOT = $(shell pwd)
INSTALL = $(ROOT)/install

# sdk
SYSROOT = $(ROOT)/sysroot
LLVM = $(ROOT)/llvm

# compile
CLANG = $(LLVM)/bin/clang
CLANGXX = $(LLVM)/bin/clang++
AR = $(LLVM)/bin/llvm-ar
AS = $(LLVM)/bin/llvm-as
NM = $(LLVM)/bin/llvm-nm
RANLIB = $(LLVM)/bin/llvm-ranlib
STRIP = $(LLVM)/bin/llvm-strip
OBJDUMP = $(LLVM)/bin/llvm-objdump
LD = $(LLVM)/bin/ld.lld

# cflags
OHOS_CFLAGS = --target=arm-liteos -march=armv7-a --sysroot=$(SYSROOT)
OHOS_CFLAGS += -I$(SYSROOT)/usr/include/arm-liteos
OHOS_CFLAGS += -L$(SYSROOT)/usr/lib/arm-liteos
OHOS_CFLAGS += -I$(LLVM)/include
OHOS_CFLAGS += -L$(LLVM)/lib

ffmpeg:
	@mkdir -p $(INSTALL) && 
	tar -xzf $(ROOT)/FFmpeg-n4.4.tar.gz -C $(INSTALL) && 
	cd $(INSTALL)/FFmpeg-n4.4 && 
	./configure 
		--prefix=$(INSTALL) 
		--arch=armv7-a 
		--target-os=linux 
		--disable-asm 
		--disable-programs 
		--disable-avdevice 
		--enable-cross-compile 
		--enable-small 
		--enable-shared 
		--cc=$(CLANG) 
		--ld=$(CLANG) 
		--strip=$(STRIP) 
		--extra-cflags="$(OHOS_CFLAGS) $(OHOS_INCS) $(OHOS_LIBS)" 
		--extra-ldflags="$(OHOS_CFLAGS) $(OHOS_INCS) $(OHOS_LIBS)" && 
	make -j4 && make install && 
	cd - && 
	rm -rf $(INSTALL)/FFmpeg-n4.4

3. 编译

make ffmpeg
    编译结束生成依赖库和头文件到install目录

三、总结

1. 基本套路

    利用configure的CC、cc、–cc、CFLAGS、–extra-cflags等替换编译工具以及添加cflags,有些库–help时可能见不到这些参数,但不妨试试,有些只是没有显示而已; 遇到没法通过configure配置的,可以先配置成arm交叉编译器,再通过sed替换Makefile、.mk、.mak文件中的编译器和cflags;

2. 检查生成文件

    使用file指令检查.o、.so文件的编译器信息,时常检查,避免多重依赖时链接检查不通过;以上面编译生成的文件为例,正确结果如图,否则可能使用了系统gcc;

3. 其它问题

    OpenHarmony系统中已存在部分ffmpeg库文件,混用可能存在链接错乱问题,不知道通过修改ffmpeg库名称或使用-Wl,-soname可否避免。
经验分享 程序员 微信小程序 职场和发展