【错误记录】Android NDK 错误排查记录 ( error: undefined reference to | Linking CXX shared library FAILED )
文章目錄
- 一、 報錯信息
- 二、 錯誤分析
- 三、 錯誤總結
一、 報錯信息
報錯信息 :
Build command failed. Error while executing process Y:\001_DevelopTools\002_Android_SDK\cmake\3.6.4111459\bin\cmake.exe with arguments {--build Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\.externalNativeBuild\cmake\debug\armeabi-v7a --target native-lib} [1/9] Building C object librtmp/CMakeFiles/rtmp.dir/parseurl.c.o [2/9] Building C object librtmp/CMakeFiles/rtmp.dir/amf.c.o [3/9] Building C object librtmp/CMakeFiles/rtmp.dir/hashswf.c.o [4/9] Building C object librtmp/CMakeFiles/rtmp.dir/rtmp.c.o [5/9] Building C object librtmp/CMakeFiles/rtmp.dir/log.c.o In file included from Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp\librtmp\amf.c:33:Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp\librtmp/bytes.h:74:2: warning: "Float word order not defined, assuming the same as byte order!" [-W#warnings]#warning "Float word order not defined, assuming the same as byte order!"^1 warning generated.[6/9] Linking C static library librtmp\librtmp.a [7/9] Building CXX object CMakeFiles/native-lib.dir/VedioChannel.cpp.o [8/9] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o clang++: warning: argument unused during compilation: '-LY:/002_WorkSpace/001_AS/RTMP_Pusher/app/src/main/cpp/libs/armeabi-v7a' [-Wunused-command-line-argument]clang++: warning: argument unused during compilation: '-LY:/002_WorkSpace/001_AS/RTMP_Pusher/app/src/main/cpp/libs/armeabi-v7a' [-Wunused-command-line-argument][9/9] Linking CXX shared library Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so FAILED: cmd.exe /C "cd . && Y:\001_DevelopTools\002_Android_SDK\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi21 --gcc-toolchain=Y:/001_DevelopTools/002_Android_SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=Y:/001_DevelopTools/002_Android_SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -LY:/002_WorkSpace/001_AS/RTMP_Pusher/app/src/main/cpp/libs/armeabi-v7a -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libnative-lib.so -o Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so CMakeFiles/native-lib.dir/native-lib.cpp.o CMakeFiles/native-lib.dir/VedioChannel.cpp.o librtmp/librtmp.a -llog -latomic -lm && cd ." Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:23: error: undefined reference to 'x264_picture_clean'Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:79: error: undefined reference to 'x264_param_default_preset'Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:169: error: undefined reference to 'x264_picture_clean'Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:177: error: undefined reference to 'x264_picture_alloc'Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:182: error: undefined reference to 'x264_encoder_close'Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:186: error: undefined reference to 'x264_encoder_open_157'Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:248: error: undefined reference to 'x264_encoder_encode'clang++: error: linker command failed with exit code 1 (use -v to see invocation)ninja: build stopped: subcommand failed.二、 錯誤分析
CMakeList.txt 構建腳本如下 : 跟著該構建腳本 , 逐步向下排查 ;
cmake_minimum_required(VERSION 3.4.1)# 鏈接 src/main/cpp/librtmp 目錄下的構建腳本 add_subdirectory(librtmp)add_library( # 函數庫名稱native-lib# 動態庫類型SHARED# 源文件native-lib.cppVedioChannel.cpp)find_library( # 日志庫log-liblog )# 設置頭文件搜索路徑 include_directories(include)# 通過設置編譯選項, 設置函數庫的搜索路徑 # 此處的 ANDROID_ABI 是在 # build.gradle android->defaultConfig->externalNativeBuild->cmake # 下的 abiFilters 中設置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")target_link_libraries( # 鏈接動態庫native-lib# 編譯的 rtmp 靜態庫rtmp${log-lib} )NDK 代碼編譯時 , 執行了 999 個步驟 , 第 1 ~ 6 步驟 :
開始構建時 , 指定第一行編譯腳本內容 , add_subdirectory(librtmp) , 編譯 librtmp 目錄下的 CMakeList.txt 內容 ;
# 鏈接 src/main/cpp/librtmp 目錄下的構建腳本 add_subdirectory(librtmp)編譯 RTMP 源代碼 , 該步驟執行下面的構建腳本 , 編譯 librtmp.so 庫 , 對應了如下腳本內容 ;
cmake_minimum_required(VERSION 3.4.1)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")add_library( # 編譯的庫的名稱是 rtmprtmp# 編譯的 rtmp 庫是靜態庫STATIC# rtmp 庫的源文件amf.chashswf.clog.cparseurl.crtmp.c )第 7,87 , 87,8 步 , 編譯 VedioChannel.cpp 源碼 , 編譯 native-lib.cpp 源碼 , 對應編譯 libnative-lib.so 函數庫 ;
add_library( # 函數庫名稱native-lib# 動態庫類型SHARED# 源文件native-lib.cppVedioChannel.cpp)第 999 步 , 鏈接函數庫 , 在這一步鏈接出錯 , 沒有找到 x264 開源庫中的函數 ;
x264 開源庫編譯過程 : x264 開源庫的頭文件放在 include 目錄中 , 交叉編譯的函數庫放在 libs/armeabi-v7a 目錄中 ;
# 設置頭文件搜索路徑 include_directories(include)# 通過設置編譯選項, 設置函數庫的搜索路徑 # 此處的 ANDROID_ABI 是在 # build.gradle android->defaultConfig->externalNativeBuild->cmake # 下的 abiFilters 中設置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")x264 開源庫肯定是編譯通過了 , 在鏈接的時候 , x264 沒有鏈接到 native-lib 中 , 導致無法訪問 x264 開源庫中的函數 ;
target_link_libraries( # 鏈接動態庫native-lib# 編譯的 rtmp 靜態庫rtmp${log-lib} )修改方法 : 在鏈接庫的時候 , 將 x264 庫添加上去 ;
target_link_libraries( # 鏈接動態庫native-lib# 編譯的 rtmp 靜態庫rtmp# 預編譯的 x264 靜態庫x264${log-lib} )最終修改后的構建腳本 ( 正確構建腳本 ) :
cmake_minimum_required(VERSION 3.4.1)# 鏈接 src/main/cpp/librtmp 目錄下的構建腳本 add_subdirectory(librtmp)add_library( # 函數庫名稱native-lib# 動態庫類型SHARED# 源文件native-lib.cppVedioChannel.cpp)find_library( # 日志庫log-liblog )# 設置頭文件搜索路徑 include_directories(include)# 通過設置編譯選項, 設置函數庫的搜索路徑 # 此處的 ANDROID_ABI 是在 # build.gradle android->defaultConfig->externalNativeBuild->cmake # 下的 abiFilters 中設置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")target_link_libraries( # 鏈接動態庫native-lib# 編譯的 rtmp 靜態庫rtmp# 預編譯的 x264 靜態庫x264${log-lib} )三、 錯誤總結
錯誤總結 : 遇到 Linking CXX shared library 步驟失敗 , 并提示 error: undefined reference to 無法找到函數 , 是鏈接步驟出錯 , 修改 CMakeList.txt 中的 target_link_libraries 鏈接參數 ;
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【错误记录】Android NDK 错误排查记录 ( error: undefined reference to | Linking CXX shared library FAILED )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】Android NDK 错误
- 下一篇: 【Android RTMP】RTMP 直