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)庫先后順序不正確,引起的符號定義找不到。
解決方案:
-
修改靜態(tài)庫的鏈接順序。
target_link_libraries( native-lib avfilter avformat avcodec avutil swresample swscale log)
-
忽略靜態(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