本文主要是介绍mac/window clion 交叉编译 android so踩坑之路.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
之前直接提取ndk目录的g++,gcc发现出现勒很多很多问题, 也翻阅勒太多太多文章,终究是没找到解决方法,
今天无意中发现一篇文章.https://my.oschina.net/gotax/blog/516861
虽然文章是4.8的演示,到了6.9有所变化,但是生成独立编译链的方式应该是没错了.
/Users/aaa/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --install-dir=~/Documents/dev/ndk_toolchain --force
#set(CMAKE_C_COMPILER gcc)
#指定需要CMAKE的最小版本
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_C_VISIBILITY_PRESET hidden)
#set (CMAKE_C_COMPILER /Users/aaa/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64)
#add_library(qssq666x SHARED main.c )
add_executable(qssq666x main.c)
cmake_minimum_required(VERSION 3.3)
project(demo)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")# Android 5.0 以上需要在此处设置 PIE
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")# 配置使用 NDK Standalone Toolchain 编译
set(NDK_STANDALONE_TOOLCHAIN /Users/aaa/Documents/dev/ndk_toolchain)
set(CMAKE_SYSTEM_NAME AndroidARM)
set(CMAKE_SYSTEM_VERSION 3)set(CMAKE_C_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/arm-linux-androideabi-gcc)set(CMAKE_CXX_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/arm-linux-androideabi-g++)
set(CMAKE_FIND_ROOT_PATH ${NDK_STANDALONE_TOOLCHAIN})# 使用 NDK 提供的头文件
add_definitions("--sysroot=${NDK_STANDALONE_TOOLCHAIN}/sysroot")aux_source_directory(src SOURCE_FILES)
add_executable(hello main.c)# /Users/aaa/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --install-dir=~/Documents/dev/ndk_toolchain --force
设置界面
配置成功就有下图 可以运行,如果配置错误是看不到自己创建的cmake选项的.
编译成功就会有如下提示, 设置编译的目录可以自由设置,生存的文件是没有后缀名的.
./arm-linux-androideabi-gcc test.c -o hello
上面这个可以在4.4的夜神模拟器运行,但是5.0以上就是
error: only position independent executables (PIE) are supported.
错误
解决5.0以上Illegal Instruction
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
解决5.0一下magic 7F45 yeshen
删除-pie
但是删除之后 5.0以上就出错勒,mmp,我彻底崩溃勒,各位知道解决方法的求指点.
独立生成工具链的的几种方式
///Users/aaa/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --abis=armeabi-v7a --install-dir=~/Documents/dev/ndk_toolchain --platform=android-2///Users/aaa/Library/Android/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh --abis=armeabi-v7a --install-dir=~/Documents/dev/ndk_toolchain --platform=android-21 --force
clion设置中可以设置make,cmake,g++ gcc, 调试器,也可以通过cmaketxt设置,
如果在cmake里面设置了-pie后果就是导致直接电脑测试模式也出现错误..
关于语法提示
根据本文章设置就可以解决.
目前依然没解决交叉编译问题,目前没解决的问题就是安卓系统全平台兼容.的so如何生成.
这种方式在5.0以上无法运行.
最简单的方式
/*D:\env\android_sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>D:\en
v\android_sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-
androideabi-gcc.exe --sysroot E:\cross-c\ndk_toolchain\sysroot hello.c -o helloD:\env\android_sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>
adb shell "/data/local/tmp/hello"
/system/bin/sh: /data/local/tmp/hello: can't execute: Permission denied
adb shell "chmod 777 /data/local/tmp/hello"
adb shell "/data/local/tmp/hello"
"/data/local/tmp/hello": error: only position independent executables (PIE) are supported.
arm-linux-androideabi-gcc.exe --help
*/
position independent executables (PIE) are supported.
arm-linux-androideabi-gcc.exe -pie --sysroot E:\cross-c\ndk_toolchain\sysroot hello.c -o hello
最终没有搞定的就是非命令行 也就window的cmake 集合nija编译,蛋疼了 估计要把cmake.xxxx.file整个改掉,
不自定义 cmake路径就无法执行,设置之后就导致这个问题。
cmake_minimum_required(VERSION 3.6)
#file(GLOB native_srcs "${CMAKE_SOURCE_DIR}/src/*.cpp")
include_directories(${CMAKE_SOURCE_DIR}/include)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
# Android 5.0 以上需要在此处设置 PIE
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
set(NDK_STANDALONE_TOOLCHAIN E:/cross-c/ndk_toolchain)
set(CMAKE_SYSTEM_NAME AndroidARM)
set(CMAKE_SYSTEM_VERSION 3)#set(CMAKE_C_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/arm-linux-androideabi-gcc)
#set(CMAKE_CXX_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/arm-linux-androideabi-g++)
set(CMAKE_FIND_ROOT_PATH ${NDK_STANDALONE_TOOLCHAIN})
add_definitions("--sysroot=${NDK_STANDALONE_TOOLCHAIN}/sysroot")
include_directories(${CMAKE_SOURCE_DIR}/include)
aux_source_directory(src SOURCE_FILES)
message("dir:${SOURCE_FILES}")#STATIC表示编译结果为静态库.a,如果想为动态库.so,可改为SHARED
#add_library(Add STATIC ${native_srcs}) # 如果同时添加 same name already exists. The existing target is a static library created
add_executable(Add ${SOURCE_FILES})
牛逼的朋友求解决,我是不懂怎么搞了。
更多参考
https://blog.csdn.net/zhou12314/article/details/74275838https://www.cnblogs.com/rickyk/p/3875334.htmlhttps://www.cnblogs.com/myblesh/p/6639964.htmlhttps://dmerej.info/blog/post/chuck-norris-part-6-android-cross-compilation/https://android.googlesource.com/platform/external/android-cmake/+/upstream-master/android.toolchain.cmakehttps://developer.android.com/ndk/guides/standalone_toolchain?hl=zh-cn
这篇关于mac/window clion 交叉编译 android so踩坑之路.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!