简书链接:macwindowclion交叉编译androidso踩坑之路 文章字数:979,阅读全文大约需要3分钟 之前直接提取ndk目录的g++,gcc发现出现勒很多很多问题, 也翻阅勒太多太多文章,终究是没找到解决方法,
今天无意中发现一篇文章.https://my.oschina.net/gotax/blog/516861 虽然文章是4.8的演示,到了6.9有所变化,但是生成独立编译链的方式应该是没错了.
1 2 /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
1 2 3 4 5 6 7 8 #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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 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选项的. 编译成功就会有如下提示, 设置编译的目录可以自由设置,生存的文件是没有后缀名的.
1 ./arm-linux-androideabi-gcc test.c -o hello
上面这个可以在4.4的夜神模拟器运行,但是5.0以上就是
1 error: only position independent executables (PIE) are supported.
错误
解决5.0以上Illegal Instruction
1 2 3 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,我彻底崩溃勒,各位知道解决方法的求指点.
独立生成工具链的的几种方式 1 2 3 4 ///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以上无法运行.
最简单的方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* 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 hello D:\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路径就无法执行,设置之后就导致这个问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 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/74275838 https://www.cnblogs.com/rickyk/p/3875334.html https://www.cnblogs.com/myblesh/p/6639964.html https://dmerej.info/blog/post/chuck-norris-part-6-android-cross-compilation/ https://android.googlesource.com/platform/external/android-cmake/+/upstream-master/android.toolchain.cmake https://developer.android.com/ndk/guides/standalone_toolchain?hl=zh-cn https://cmake.org/cmake/help/v3.7/manual/cmake-toolchains.7.html#cross-compiling-for-android