上篇博客中已经完成了把C/C++编译为js工具Emscripten的安装。但是在真正的项目开发中用到众多第三方库,在单纯的使用C/C++时,我们只需添加动态链接-L、-I便可正常编译使用,而我们在编译调用了第三方库的C文件时,该如何使用emscripten工具呢?
对于此问题官方文档上只是一带而过(https://emscripten.org/docs/compiling/Building-Projects.html#using-libraries),并没有给出如何将第三方库编译为.bc文件。本文便以ffmpeg为例,详细说明如何将第三库编译为.bc文件。
emcc version:1.38.21
ffmpeg version:3.3.2
一、准备ffmpeg
1、新建em_ffmpeg目录 $ mkdir em_ffmpeg
2、将ffmpeg3.3.2移入目录 $ cp ffmpeg-3.3.2.tar.gz em_ffmpeg/
3、解压 $ tar -zxvf ffmpeg-3.3.2.tar.gz
二、准备emscripten
1、配置emscripten环境变量
$ cd ~/emsdk/
$ source emsdk_env.sh
2、检验emscripen $emcc -v 输出正常
三、编译ffmpeg
1、进入目录 $ cd em_ffmpeg
2、新建链接库输出地址 $ cd / && mkdir em_ffmpeg
3、进入目录 $ cd ffmpeg-3.3.2/
4、配置编译文件 $ emconfigure ./configure --cc="emcc" --prefix=/em_ffmpeg --enable-cross-compile --target-os=none --arch=x86_32 --cpu=generic --disable-ffplay --disable-ffprobe --disable-asm --disable-doc --disable-devices --disable-pthreads --disable-w32threads --disable-network --disable-hwaccels --disable-parsers --disable-bsfs --disable-debug --disable-protocols --disable-indevs --disable-outdevs --enable-protocol=file
5、 $ make
6、$ sudo make install
7、此时已成功编译emscripten版本的ffmpeg,进行查看 $cd /em_ffmpeg && ls 可以看到bin、include、lib、share四个文件夹。$cd bin&&file ffmpeg。可以看到此ffmpeg为LLVM bitcode文件,证明编译成功。
8、尽管已经编译完成,但是并没有找到开发文档中的.bc文件,其实.bc文件已经产生只是明明不通,只有修改即可。$ cd lib 可以看到目录中一共有7个.a文件,直接使用mv指令修改即可,例:mv libavutil.a libavutil.bc。最终结果如下
9、到此所有编译工作已经完成,后续使用emscripten将调用了ffmpeg库的C/C++文件进行编译时,只用加上上面的动态链接即可,例: $mcc simplest_ffmpeg_decoder.cpp ./lib/libavformat.bc ./lib/libavcodec.bc ./lib/libswscale.bc ./lib/libswresample.bc ./lib/libavutil.bc -I./include -Os -s WASM=1 -o player.html