音视频开发进阶指南(第三章)-引用静态库

简介: 笔记

引用静态库报错


error: ../../../../libs//libavcodec.a(allcodecs.o): incompatible target
error: ../../../../libs//libavcodec.a(avpicture.o): incompatible target
error: ../../../../libs//libavcodec.a(decode.o): incompatible target
error: ../../../../libs//libavcodec.a(utils.o): incompatible target
error: ../../../../libs//libavformat.a(allformats.o): incompatible target
error: ../../../../libs//libavformat.a(options.o): incompatible target
error: ../../../../libs//libavformat.a(utils.o): incompatible target
error: ../../../../libs//libavutil.a(channel_layout.o): incompatible target
error: ../../../../libs//libavutil.a(frame.o): incompatible target
error: ../../../../libs//libavutil.a(mem.o): incompatible target
error: ../../../../libs//libavutil.a(samplefmt.o): incompatible target

翻译过来就是目标不兼容。

于是又翻过头去查找之前编译的问题。


重新编译FDK-AAC

发现其实在编译过程中有报错,通过修改了下源码编译通过了。


重新编译FFmpeg

重新一点点得分析编译Log,确定没有报错出现,再把生成的.a文件导入到AS里,还是有如下错误:

FAILED: cmd.exe /C "cd . && D:\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=armv7-none-linux-androideabi --gcc-toolchain=D:/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64 --sysroot=D:/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem D:/Android/Sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=19 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -frtti -fexceptions -std=c++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot D:/Android/Sdk/ndk-bundle/platforms/android-19/arch-arm -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--fix-cortex-a8 -Wl,--exclude-libs,libunwind.a -LD:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libaudiodecoder.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\armeabi-v7a\libaudiodecoder.so CMakeFiles/audiodecoder.dir/src/main/cpp/Mp3Decoder.cpp.o CMakeFiles/audiodecoder.dir/src/main/cpp/ffmpegmp3decoder.cpp.o CMakeFiles/audiodecoder.dir/src/main/cpp/mp3decoder_controller.cpp.o  ../../../../libs//libavcodec.a ../../../../libs//libavdevice.a ../../../../libs//libavfilter.a ../../../../libs//libavformat.a ../../../../libs//libavutil.a ../../../../libs//libswresample.a ../../../../libs//libswscale.a -llog -latomic -lm "D:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_static.a" "D:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++abi.a" "D:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libandroid_support.a" "D:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libunwind.a" "-ldl" && cd ."
../../../../libs//libavformat.a(utils.o):utils.c:function update_stream_avctx: error: undefined reference to 'av_parser_close'
../../../../libs//libavformat.a(utils.o):utils.c:function free_stream: error: undefined reference to 'av_parser_close'
../../../../libs//libavformat.a(utils.o):utils.c:function parse_packet: error: undefined reference to 'av_parser_parse2'
../../../../libs//libavformat.a(utils.o):utils.c:function parse_packet: error: undefined reference to 'av_parser_close'
../../../../libs//libavformat.a(utils.o):utils.c:function ff_read_frame_flush: error: undefined reference to 'av_parser_close'
../../../../libs//libavformat.a(utils.o):utils.c:function read_frame_internal: error: undefined reference to 'av_parser_init'
../../../../libs//libavformat.a(utils.o):utils.c:function avformat_find_stream_info: error: undefined reference to 'av_parser_init'
../../../../libs//libavformat.a(utils.o):utils.c:function avformat_find_stream_info: error: undefined reference to 'avcodec_pix_fmt_to_codec_tag'
../../../../libs//libavformat.a(utils.o):utils.c:function avformat_find_stream_info: error: undefined reference to 'avpriv_get_raw_pix_fmt_tags'
../../../../libs//libavformat.a(utils.o):utils.c:function av_apply_bitstream_filters: error: undefined reference to 'av_bitstream_filter_filter'
../../../../libs//libavformat.a(id3v2.o):id3v2.c:function id3v2_read_internal.part.0: error: undefined reference to 'uncompress'
../../../../libs//libavformat.a(rtmpproto.o):rtmpproto.c:function rtmp_open: error: undefined reference to 'inflateInit_'
../../../../libs//libavformat.a(rtmpproto.o):rtmpproto.c:function rtmp_open: error: undefined reference to 'inflate'
../../../../libs//libavformat.a(rtmpproto.o):rtmpproto.c:function rtmp_open: error: undefined reference to 'inflateEnd'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)

经过一番分析,在一篇文章中我发现是cMakeLists.txt中的target_link_libraries问题,静态链接库是有顺序的。*target_link_libraries里库文件的顺序符合gcc链接顺序的规则,即被依赖的库放在依赖它的库的后面。这一点很重要,通过调整链接库的顺序,解决了一大半的报错。

然而还是有下面的报错:

> Build command failed.
  Error while executing process D:\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build G:\NDKProject\Mp3Encoder\.cxx\cmake\debug\armeabi-v7a --target audiodecoder}
  [1/1] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\armeabi-v7a\libaudiodecoder.so
  FAILED: cmd.exe /C "cd . && D:\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=armv7-none-linux-androideabi --gcc-toolchain=D:/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64 --sysroot=D:/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem D:/Android/Sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=19 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -frtti -fexceptions -std=c++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot D:/Android/Sdk/ndk-bundle/platforms/android-19/arch-arm -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--fix-cortex-a8 -Wl,--exclude-libs,libunwind.a -LD:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libaudiodecoder.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\armeabi-v7a\libaudiodecoder.so CMakeFiles/audiodecoder.dir/src/main/cpp/Mp3Decoder.cpp.o CMakeFiles/audiodecoder.dir/src/main/cpp/ffmpegmp3decoder.cpp.o CMakeFiles/audiodecoder.dir/src/main/cpp/mp3decoder_controller.cpp.o  ../../../../libs//libavformat.a ../../../../libs//libavdevice.a ../../../../libs//libavfilter.a ../../../../libs//libavcodec.a ../../../../libs//libavutil.a ../../../../libs//libswresample.a ../../../../libs//libswscale.a -llog -latomic -lm "D:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_static.a" "D:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++abi.a" "D:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libandroid_support.a" "D:/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libunwind.a" "-ldl" && cd ."
  ../../../../libs//libavformat.a(id3v2.o):id3v2.c:function id3v2_read_internal.part.0: error: undefined reference to 'uncompress'
  ../../../../libs//libavformat.a(rtmpproto.o):rtmpproto.c:function rtmp_open: error: undefined reference to 'inflateInit_'
  ../../../../libs//libavformat.a(rtmpproto.o):rtmpproto.c:function rtmp_open: error: undefined reference to 'inflate'
  ../../../../libs//libavformat.a(rtmpproto.o):rtmpproto.c:function rtmp_open: error: undefined reference to 'inflateEnd'
  clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.

参考jni封装ffmpeg接口遇到的错误修改方法,原来是ffmpeg4.0中依赖了libz库,书中使用的ffmpeg2.8版本的还没有依赖,该库是系统库,所以可以直接使用。于是修改cMakeLists.txt如下:

target_link_libraries(audiodecoder z)  //首先链接libz库
target_link_libraries(audiodecoder avformat)
target_link_libraries(audiodecoder avdevice)
target_link_libraries(audiodecoder avfilter)
target_link_libraries(audiodecoder avcodec)
target_link_libraries(audiodecoder avutil)
target_link_libraries(audiodecoder swresample)
target_link_libraries(audiodecoder swscale)

又解决了一部分报错。

还剩下一个报错:

../../../../libs//libavformat.a: error adding symbols: File in wrong format

原来是因为gradle配置问题,参考Android Studio 解决:error adding symbols: File in wrong format clang++.exe: error: linker command failed with exit code 1,于是修改gradle如下:

defaultConfig {
        applicationId "com.flyscale.mp3encoder"
        minSdkVersion 19
        compileSdkVersion(26)
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags " -frtti -fexceptions -std=c++11  "
                abiFilters 'armeabi-v7a', 'arm64-v8a'
                cFlags "-DSTDC_HEADERS"
            }
        }
        //指定CPU架构过滤,注意如果你使用的NDK版本大于17,要使用armeabi-v7a,因为如ndk17以后主不支持armeabi了
        ndk{
            abiFilters 'armeabi-v7a'
        }
    }

如果你使用的NDK大于17会报错如下:

Error:ABIs [arm64-v8a] are not supported for platform. Supported ABIs are [armeabi, armeabi-v7a

解决方法就是指明armeabi-v7a等,参[Error:ABIs [arm64-v8a] are not supported for platform. Supported ABIs are armeabi, armeabi-v7a

至此解决了关于NDK编译的问题。

目录
相关文章
|
5月前
|
编译器 vr&ar C++
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
|
6月前
|
C语言
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
38 1
|
6月前
|
存储 自然语言处理 编译器
【C语言】编译和链接深度剖析
【C语言】编译和链接深度剖析
131 2
|
6月前
|
自然语言处理 算法 前端开发
编译原理 -概述
编译原理 -概述
41 0
|
6月前
|
编译器 C++
(保姆级)函数进阶内容以及静态库的基础知识
(保姆级)函数进阶内容以及静态库的基础知识
56 5
|
算法 Unix 程序员
C++简介 C语言编程原理
C++简介 C语言编程原理
|
存储 人工智能 算法
C++ Primer Plus 第6版 读书笔记(7)第 7 章 函数——C++的编程模块
乐趣在于发现。仔细研究,读者将在函数中找到乐趣。C++自带了一个包含函数的大型库(标准 ANSI 库加上多个 C++类),但真正的编程乐趣在于编写自己的函数;另一方面,要提高编程效率,本章和第 8 章介绍如何定义函数、给函数传递信息以及从函数那里获得信息。
165 0
|
存储 自然语言处理 Java
C语言进阶第十篇【程序的编译(预处理操作)+链接】(上)
C语言进阶第十篇【程序的编译(预处理操作)+链接】(上)
119 0
C语言进阶第十篇【程序的编译(预处理操作)+链接】(上)
|
编译器 Linux C语言
C语言进阶第十篇【程序的编译(预处理操作)+链接】(下)
C语言进阶第十篇【程序的编译(预处理操作)+链接】(下)
126 0
C语言进阶第十篇【程序的编译(预处理操作)+链接】(下)
|
安全 API 调度
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
下一篇
无影云桌面