NDK编译X265库到ARM,遇到问题

来源:互联网 发布:淘宝天猫怎么开店 编辑:程序博客网 时间:2024/06/15 04:30

之前两篇博客介绍了,如何用arm-none-linux-gnueabi-gcc编译器交叉编译x265的库,但用这个编译出的库必须要把动态库加上。我为了要在android项目上应用x265的静态库,还是要用NDK进行编译,这又出现了很多问题,我把我解决了的贴出来,供大家分享,我还在编译中。x265往android上编译,最主要的问题是,android基于linux内核开发,但却对一些库做了修改,有一些库android并不支持,所以我们要针对问题,再解决。
问题一:利用cmake在linux下编译,往cmakelist.txt下添加交叉编译器等信息后,设置如下:

set( CMAKE_SYSTEM_NAME Linux )set( CMAKE_C_COMPILER "ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc ")set( CMAKE_CXX_COMPILER "ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++")

但却出现问题:

-- cmake version 2.8.9-- The C compiler identification is GNU 4.8.0-- The CXX compiler identification is GNU 4.8.0-- Check for working C compiler: /home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc-- Check for working C compiler: /home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -- brokenCMake Error at /usr/cmake-2.8.9-Linux-i386/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):  The C compiler  "/home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"  is not able to compile a simple test program.  It fails with the following output:   Change Dir: /home/heling/x265_1.6/source/CMakeFiles/CMakeTmp  Run Build Command:/usr/bin/make "cmTryCompileExec4150547758/fast"  /usr/bin/make -f CMakeFiles/cmTryCompileExec4150547758.dir/build.make  CMakeFiles/cmTryCompileExec4150547758.dir/build  make[1]: 正在进入目录  `/home/heling/x265_1.6/source/CMakeFiles/CMakeTmp'  /usr/cmake-2.8.9-Linux-i386/bin/cmake -E cmake_progress_report  /home/heling/x265_1.6/source/CMakeFiles/CMakeTmp/CMakeFiles 1  Building C object  CMakeFiles/cmTryCompileExec4150547758.dir/testCCompiler.c.o  /home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc  -o CMakeFiles/cmTryCompileExec4150547758.dir/testCCompiler.c.o -c  /home/heling/x265_1.6/source/CMakeFiles/CMakeTmp/testCCompiler.c  Linking C executable cmTryCompileExec4150547758  /usr/cmake-2.8.9-Linux-i386/bin/cmake -E cmake_link_script  CMakeFiles/cmTryCompileExec4150547758.dir/link.txt --verbose=1  /home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc  CMakeFiles/cmTryCompileExec4150547758.dir/testCCompiler.c.o -o  cmTryCompileExec4150547758 -rdynamic  /home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:  error: cannot open crtbegin_dynamic.o: 没有那个文件或目录  /home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:  error: cannot open crtend_android.o: 没有那个文件或目录  /home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:  error: cannot find -lc  /home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:  error: cannot find -ldl  collect2: error: ld returned 1 exit status  make[1]: *** [cmTryCompileExec4150547758] 错误 1  make[1]:正在离开目录  `/home/heling/x265_1.6/source/CMakeFiles/CMakeTmp'  make: *** [cmTryCompileExec4150547758/fast] 错误 2

在谷歌上搜索,发现很多人都出现这个问题,但没有一个解决方法,我利用NDK,做了一个交叉工具链,再把链接给cmake,如下进行设置:

cd  /ndk/build/tools  //进入ndk目录下的/build/tools./make-standalone-toolchain.sh --platform=android-14 --ndk-dir=/home/heling/webrtc/WebRTC20140723_bak/trunk/third_party/android_tools/ndk/ --install-dir=/home/heling/android-14-toolchain/ --system=linux-x86_64  //对工具链进行设置    --install-dir工具链安装位置//然后在cmakelist中做如下设置set( CMAKE_SYSTEM_NAME Linux )set( CMAKE_C_COMPILER "/home/heling/android-14-toolchain/arm-linux-androideabi/bin/gcc")set( CMAKE_CXX_COMPILER "/home/heling/android-14-toolchain/arm-linux-androideabi/bin/g++")//工具链的绝对地址信息

然后执行 cmake ../source这个问题解决了,但还出现其他的问题。


问题二:
上面一个问题解决后,在make,出现了问题:

[ 30%] Building CXX object common/CMakeFiles/common.dir/picyuv.cpp.o[ 32%] Building CXX object common/CMakeFiles/common.dir/common.cpp.o/home/heling/桌面/x265_1.6/source/common/common.cpp: In function 'void* x265_malloc(size_t)':/home/heling/桌面/x265_1.6/source/common/common.cpp:79:59: error: 'posix_memalign' was not declared in this scope/home/heling/桌面/x265_1.6/source/common/common.cpp: In function 'double x265_qScale2qp(double)':/home/heling/桌面/x265_1.6/source/common/common.cpp:151:33: error: 'log2' was not declared in this scopemake[2]: *** [common/CMakeFiles/common.dir/common.cpp.o] 错误 1make[1]: *** [common/CMakeFiles/common.dir/all] 错误 2make: *** [all] 错误 2

可以看到这些报错都是因为android不支持这些函数的原因,android不支持log2,所以用log来进行替换。
posix_memalign 这个函数android也不识别,换为memalign。
解决完这个问题后,接着make ,发现又出现了问题。


问题三:

[ 85%] Building CXX object encoder/CMakeFiles/encoder.dir/weightPrediction.cpp.o[ 85%] Built target encoderScanning dependencies of target x265-sharedLinking CXX shared library libx265.so/home/heling/android-14-toolchain/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lpthreadcollect2: ld returned 1 exit statusmake[2]: *** [libx265.so.51] 错误 1make[1]: *** [CMakeFiles/x265-shared.dir/all] 错误 2make: *** [all] 错误 2

因为android的ndk虽然有pthread.h,但是没有libpthread.a,集成到libc.a里了,
所以在编译x265时,不需要去链接-lpthread,解决办法就是在source目录下的cmakelist.txt中将

 list(APPEND PLATFORM_LIBS pthread) 更改为list(APPEND PLATFORM_LIBS)list(REMOVE_ITEM PLIBLIST "-lc" "-lpthread")更改为list(REMOVE_ITEM PLIBLIST "-lc")保存后,再cmake../source,最后make 就成功了!!!
0 0
原创粉丝点击