鸿蒙(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可否避免。
