把NDK的工具链提取出来单独使用
- 独立toolchain
把NDK压缩包解压到系统,如/mnt目录下,后在/mnt目录下建立文件夹my_ndk_toolchain,然后再/mnt目录下执行以下命令:
/mnt/android-ndk-r9c/build/tools/make-standalone-toolchain.sh --platform=android-19 --toolchain=arm-linux-androideabi-4.8 --stl=stlport --install-dir=/mnt/my_ndk_toolchain
出现以下打印:
dir=/mnt/my_ndk_toolchain
Copying prebuilt binaries...
Copying sysroot headers and libraries...
Copying libstdc++ headers and libraries...
Copying files to: /mnt/my_ndk_toolchain
Cleaning up...
Done.
说明独立的工具链成功,对执行的命令进行简单说明:
/mnt/android-ndk-r9c/build/tools/make-standalone-toolchain.sh:执行NDK目录下make-standalone-toolchain.sh脚本;
--platform:指工具链将使用哪个版本的Android API,可cd /mnt/android-ndk-r9c/platform中查看,我这里使用的是Android-19;
--toolchain:指独立出来的工具链哪种用途的编译,arm(arm-linux-androideabi-4.8),X86(x86-4.8)或MIPS(mipsel-linux-android-4.8),可cd toolchains中查看并选择适合的类型,我这里使用的是嵌入式;
--stl:指工具链支持C++ stl,stlport代表C++库将静态链接,stlport_shared将动态链接;
--install-dir:指安装目录;
注意:因为我使用的是32-bit Ubuntu,独立工具链默认是32位,所以在参数中没有指定系统类型,如果是64-bit Linux系统,需加入--system=linux-x86_64 或MacOSX加入--system=darwin-x86_64。
- 测试程序
hello.cpp
#include <iostream>
#include <string>
int main(int argc, char **argv)
{
std::string str = "hello, ndk! this is my own toolchain! ^-^";
std::cout << str << std::endl;
return 0;
}
Makefile
rm=/bin/rm -f
CC=/mnt/my_ndk_toolchain/bin/arm-linux-androideabi-g++
PROGNAME = main
INCLUDES= -I.
CFLAGS = $(INCLUDES) -g -fPIC -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE
OBJS = hello.o
LDFLAGS =
all :$(PROGNAME)
%.o: %.cpp
$(CC) $(CFLAGS) -c -o $@ $<
$(PROGNAME) : $(OBJS)
@echo "Linking $(PROGNAME)......"
${CC} ${LDFLAGS} -o ${PROGNAME} ${OBJS}
@echo "Linking Success!"
clean:
$(rm) *.o $(PROGNAME)
编译后得到可执行文件:main,adb push到嵌入式Android平台后,./main运行,得到以下结果:
root@android :/data # ./main
hello, ndk! this is my own toolchain! ^-^
Generate a customized Android toolchain installation that includes
a working sysroot. The result is something that can more easily be
used as a standalone cross-compiler, e.g. to run configure and
make scripts. Valid options (defaults are in brackets): --help Print this help.
--verbose Enable verbose mode.
--dryrun Set to dryrun mode.
--toolchain=<name> Specify toolchain name
--use-llvm Use LLVM.
--stl=<name> Specify C++ STL [gnustl]
--arch=<name> Specify target architecture
--abis=<list> Specify list of target ABIs.
--ndk-dir=<path> Take source files from NDK at <path> [.]
--package-dir=<path> Place package file in <path> [/tmp/ndk-root]
--install-dir=<path> Don't create package, install files to <path> instead.
--platform=<name> Specify target Android platform/API level. [android-3]
'-march=' armv2 armv2a armv3 armv3m armv4 armv4t armv5 armv5e armv5t armv5te armv6 armv6-m armv6j armv6k armv6s-m armv6t2 armv6z armv6zk armv7 armv7-a armv7-m armv7-r armv7e-m armv7ve armv8-a armv8-a+crc iwmmxt iwmmxt2 native
arm-linux-androideabi-gcc
-MMD -MP-MF ./obj/local/armeabi-v7a/objs/usb100_static/libusb/hotplug.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes
-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -O2 -g -DNDEBUG -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300
-Ijni/libusb/android/jni/../../ -Ijni/libusb/android/jni/../../libusb -Ijni/libusb/android/jni/../../libusb/os -Ijni/libusb/android/jni/../../../ -Ijni/libusb/android/jni/../.. -DANDROID -Ijni/libusb/android/jni/../../ -Ijni/libusb/android/jni/../../libusb -Ijni/libusb/android/jni/../../libusb/os -Ijni/libusb/android/jni/../../../ -DANDROID_NDK -DLOG_NDEBUG -DACCESS_RAW_DESCRIPTORS -O3 -fstrict-aliasing -fprefetch-loop-arrays-Wa,--noexecstack -Wformat -Werror=format-security -IE:/Android_SDK/android-ndk-r10d/platforms/android-14/arch-arm/usr/include -c jni/libusb/android/jni/../../libusb/hotplug.c -o ./obj/local/armeabi-v7a/objs/usb100_static/libusb/hotplug.o arm-linux-androideabi-g++
-Wl,-soname,libusb100.so
-shared --sysroot=E:/Android_SDK/android-ndk-r10d/platforms/android-14/arch-arm -Wl,--whole-archive ./obj/local/armeabi-v7a/libusb100_static.a
-Wl,--no-whole-archive -lgcc -no-canonical-prefixes
-march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -mthumb -LE:/Android_SDK/android-ndk-r10d/platforms/android-14/arch-arm/usr/lib -llog -lc -lm -o ./obj/local/armeabi-v7a/libusb100.so
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "ARM v7"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3
Tag_Advanced_SIMD_arch: NEONv1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_optimization_goals: Aggressive Speed
Tag_CPU_unaligned_access: v6
Tag_DIV_use: Not allowed
把NDK的工具链提取出来单独使用的更多相关文章
- 使用ndk standalone工具链来编译某个平台下的库
地址: http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html It is now possible to use the toolcha ...
- Android NDK 工具链的使用方法(Standalone Toolchain)
转载:http://blog.csdn.net/smfwuxiao/article/details/6587709 首先需要确定目标机器的指令集. 如果是 x86 的机器,用 x86-4.4.3 版本 ...
- Android NDK 导出独立工具链
传统方式调试 NDK 开发的程序比较麻烦,先要编译成 JNI,又要导出 java接口,还要再写一个 java 工程,改一个地方又要连续改几处,这样效率是很低的.最频繁使用的关键工作路径(编译/调试环节 ...
- cmake工具链
命令project() enable_language()try_compile() 变量CMAKE_<LANG>_COMPILERCMAKE_<LANG>_COMPILER_ ...
- 中国的 Python 量化交易工具链有哪些
摘抄自知乎:https://www.zhihu.com/question/28557233 如题,提问的范围限于适合中国大陆金融市场使用的工具链,所以IbPy和Quotopian之类主要面向欧美市场的 ...
- Linux ARM交叉编译工具链制作过程【转】
本文转载自:http://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/02/21/2920999.html 一.下载源文件 源代码文件及其版本与下载 ...
- gcc 交叉工具链中工具使用(arm-linux-xxx)
在Ubuntu系统中使用 gcc 系列工具是在PC机上使用 arm-linux-gcc 编译的目标 是在 arm CPU上使用 一.安装交叉编译工具链 1. 编译工具怎么获取 1)从官网 http:/ ...
- xmake v2.3.4 发布, 更加完善的工具链支持
为了让xmake更好得支持交叉编译,这个版本我重构了整个工具链,使得工具链的切换更加的方便快捷,并且现在用户可以很方便地在xmake.lua中扩展自己的工具链. 关于平台的支持上,我们新增了对*BSD ...
- 从大厂DevOps工具链部署,看现代产品的生命周期管理
目录 1. 认识DevOps 1.1. DevOps工具链 1.2. CI 持续集成(Continuous Integration) 1.3. CD(持续交付 & 持续部署) 1.4. Agi ...
随机推荐
- oplog扩容
Oplog的扩容: 背景:一个由3个节点组成的复制集. 主节点:A 从节点:B,C 需求:Oplog扩容,尽量少的影响业务. 思路:先由从节点开始,一台一台的从复制集中剥离,修改,再回归复制集,最后操 ...
- 【LOJ】#2052. 「HNOI2016」矿区
题解 之前尝试HNOI2016的时候弃坑的一道,然后给补回来 (为啥我一些计算几何就写得好长,不过我写啥都长orz) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 ...
- USACO 5.5 Hidden Password
Hidden Password ACM South Eastern Europe -- 2003 Sometimes the programmers have very strange ways of ...
- Python djangorestframework安装库报错SSL: CERTIFICATE_VERIFY_FAILED
Python djangorestframework 安装库报错SSL: CERTIFICATE_VERIFY_FAILED 问题描述 使用pip按照virtualenv报错,如下: pip inst ...
- 7-13 Power Calculus 快速幂计算 uva1374
想到快速幂 但是这题用不上 用迭代加深搜索 注意启发函数为 当前最大数<<(maxx-d) 如果大于n则剪枝 注意跳出语句的两种写法 一种170ms 一种390ms !!! d ...
- java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher
java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher 出现以上异常,可能是使用Json缺少ezmorph包: 以下是Json常用的包:ezm ...
- C#.net实现图片上传功能
C#.NET前台:<asp:Image ID="imgFood" runat="server" /> <asp:FileUpload ID=& ...
- 跑对抗样本库 CleverHans 的例子时,遇到的问题
环境:Ubuntu+TensorFlow 首先是GPU被其他人占用了,怎么也跑不起来最简单的TensorFlow小例子. 所以先学会如何查看显卡使用情况,转去使用其他空闲显卡. Linux查看Nvid ...
- Java 关于集合框架那点事儿
1.引入集合框架 采用数组存在的一些缺陷: 1.数组长度固定不变,不能很好地适应元素数量动态变化的情况. 2.可通过数组名.length获取数组的长度,却无法直接获取数组中真实存储的个数. ...
- Expression表达式树 案例
1,Expression.Invoke //运用委托或Lambda表达式 System.Linq.Expressions.Expression<Func<; System.Linq.Exp ...