ffmpeg 編譯&集成問題匯總

error: undefined reference to 'av_version_info()'

出錯原因:
ffmpeg是純C的庫,頭文件沒有做好C++調(diào)用的準(zhǔn)備
用extern “C”{}套住ffmpeg頭文件,用C語言的編譯規(guī)則來編譯ffmpeg代碼,就可以了

extern "C"{
    #include <libavutil/avutil.h>
}

libavutil/log.c:186: error: undefined reference to 'stderr'

出錯原因:

代碼中使用了大量的標(biāo)準(zhǔn)IO設(shè)備:stderr 等,這些在NDK15以后,這些都不被支持了,代碼本身沒問題,只是編譯器鏈接時找不到對應(yīng)的靜態(tài)庫定義了;

解決方案:

在編譯選項中添加語句-D__ANDROID_API__=[你的android API版本號]即可;
比如我的測試手機(jī)為android 5.1.1 對應(yīng) API = 22,編譯選項中應(yīng)該添加:-D__ANDROID_API__=22

adb shell 獲取 android 系統(tǒng)版本:
adb shell getprop ro.build.version.release
adb shell 獲取 android 系統(tǒng) API 版本:
adb shell getprop ro.build.version.sdk

libavformat/utils.c:513: error: undefined reference to 'av_parser_close'

出錯原因:
鏈接靜態(tài)庫先后順序不正確,引起的符號定義找不到。

解決方案:

  1. 修改靜態(tài)庫的鏈接順序。

    target_link_libraries(
            native-lib
            avfilter avformat avcodec avutil swresample swscale
            log)
    
  1. 忽略靜態(tài)庫的鏈接順序。

    target_link_libraries(
            native-lib
            -Wl,--start-group
            avcodec avfilter avformat avutil swresample swscale
            -Wl,--end-group
            log)
    

libavformat/http.c:1649: error: undefined reference to 'inflateEnd'

出錯原因:
找不到的z庫中的函數(shù)的實現(xiàn)。因為 ffmpeg 依賴了z庫。編譯ffmpeg的時候如果仔細(xì)看編譯時輸出的日志,就可以看到
External libraries: zlib

解決方案:添加z庫的依賴。

target_link_libraries(
        native-lib
        -Wl,--start-group
        avcodec avfilter avformat avutil swresample swscale
        -Wl,--end-group
        log
        z
)

libavformat/hls.c:845: error: undefined reference to 'atof'

出錯原因:

Google have moved some of the C standard library functions like atof() from being inline functions in header files to normal functions. The latest NDKs will default to building a .so that is only compatible with the latest Android devices that have the atof() function in the device's standard C library (libc.so). This means if you run a library on an older device that has an older version of the C library, you will get an error loading the dll as the expected atof() function will not exist.

解決方案:
修改ffmpeg編譯腳本,指定Android API版本為17,重新編譯。

這里又有一個問題:

libavcodec/v4l2_buffers.c:434:44: error: call to 'mmap' declared with attribute error: mmap is not available > with _FILE_OFFSET_BITS=64 when using GCC until android-21. Either raise your minSdkVersion, disable > _FILE_OFFSET_BITS=64, or switch to Clang.

所以21版本以下,需要取消 _FILE_OFFSET_BITS宏定義。添加編譯參數(shù):
-U_FILE_OFFSET_BITS

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容