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
- NDK编译X265库到ARM,遇到问题
- cmake 交叉编译 x265到 arm32库
- [交叉编译qt4.8.4 for ARM]遇到到问题
- ndk arm64编译遇到问题
- cygwin下ndk arm交叉编译器编译ffmpeg遇到的问题(1)
- NDK 编译Lame遇到的问题
- gcc编译遇到到不能编译问题
- arm-linux下交叉编译json-c-0.9库遇到的编译问题
- 用NDK编译FFmpeg时遇到的问题
- 编译arm版本的QT遇到的问题
- Android NDK编译带ARM neon优化的库
- 【android NDK及JNI】ubuntu12.10 64位 + android-ndk-r9 编译ffmpeg遇到的问题 .
- 移植libjpeg-turbo到arm遇到的问题
- 利用ndk交叉编译x264到arm平台(带neon版本)
- 利用ndk交叉编译x264到arm平台(带neon版本)
- opus编译库到arm上面用
- NDK r6编译静态库的问题
- android ndk 编译 platinum库 问题
- ns3为协议默认安装的loopback接口
- Java_增强for循环
- 问题解决: @Resource annotation is not supported on static fields
- SQL之正则表达式
- 认识.NET
- NDK编译X265库到ARM,遇到问题
- 替换字符串String中的元素和分割字符串为数组
- Python中的base64、base32实例
- 云计算容器服务该何去何从
- android studio 目录结构
- am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试
- 我所理解lua 语言中的点、冒号与self
- Remove Duplicates from Sorted List II
- 数据结构与算法分析 L5