这个问题烦了我一天了..郁闷.本人想试验一下使用ndk里面的toolchains直接编译一个纯C的程序,使其在Android下可运行.于是在Ubuntu下写了一个简单的程序:
sayhi.c
void main(){
write(1,"hi\n",3);
}
首先设置export PATH=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin:$NDK/toolchains/arm-linuxandroideabi-4.4.3/prebuilt/linux-x86/libexec/gcc/arm-linux-androideabi/4.4.3
然后执行gcc -v -o sayhi sayhi.c,其中v参数可以输出gcc的执行过程.
其中有3条重要的命令:
ccl -quiet -v -iprefix /home/carmenloklok/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin/../lib/gcc/arm-linux-androideabi/4.4.3/ sayhi.c -mbionic -quiet -dumpbase sayhi.c -march=armv5te -mfloat-abi-soft -mfpu=vfp -auxbase sayhi -version -o /tmp/ccM7ROuN.s
as -v -march=armv5te -mfloat-abi=soft -mfpu=vfp -meabi=5 -o /tmp/cc4k3VNI.o /tmp/ccM7ROuN.s
ld --sysroot=/home/ahsieh/ndk-release/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/sysroot --eh-frame-hdr -dynamic-linker /system/bin/linker -X -m armelf_linux_eabi -o sayhi crtbegin_dynamic.o /tmp/cc4k3VNI.o -lgcc -lc -ldl -lgcc crtend_android.o
我们知道编译的过程是:预处理->编译->汇编->连接.所以gcc其实是分别调用了ccl,as,ld来达到这个目的.
从上面可以看到gcc默认给这3个命令加了一些参数.ccl和as的参数我没多理,只是复制了然后自己去调用一次.最后ld的时候,我一开始把 -dynamic-linker /system/bin/linker 这个参数给去掉了.于是编译成功后,放到android手机上运行时发现提示not found.这到底是为什么呢.?
用readelf -l查看sayhi程序,发现它的interpreter是/usr/lib/ld.so.1 查看了资料,发现android下的动态连接器是/system/bin/linker.难怪默认下ld有这个参数了!而我把它去掉了.所以该gcc(其他的gcc可能为其他值,看gcc自己的默认实现,如果不想用它的默认值,则最好分开ccl,as,ld三个步骤自己执行)就缺省动态连接器为/usr/lib/ld.so.1 很明显在android下是没有这个文件的.所以才会提示not found!
分享到:
相关推荐
标题 "解决开机报mouse not found,keyboard not found" 指出的问题是在计算机启动时,系统无法找到鼠标和键盘,导致出现错误提示。这通常与BIOS(基本输入输出系统)设置有关,因为BIOS是电脑启动时首先加载的软件,...
如果 License 文件丢失或损坏,Ewebeditor 将无法启动,提示 License not found. Disabled。 那么,什么情况下会导致 License not found. Disabled 呢?有以下几种可能: 1. License 文件丢失或损坏:如果 License...
当你遇到"LTpowerPlanner not found"的问题时,这通常意味着系统无法找到或正确识别该程序,可能是由于安装不完整、文件丢失或版本不兼容等原因导致的。以下是一些详细的解决步骤和相关知识点: 1. **检查安装路径*...
标题中的“sqlite3:not found”是一个常见的错误提示,通常在Linux或类Unix系统中出现,意味着系统找不到sqlite3命令行工具。SQLite是一款轻量级的数据库管理系统,它被广泛应用于嵌入式设备、移动应用以及服务器端...
在 Linux 系统中,经常会遇到 "bash: command not found" 的错误提示,这是因为系统无法找到相应的命令所致。解决这个问题的关键就在于理解 Linux 系统中的 PATH 变量。 PATH 变量是 Linux 系统中的一种环境变量,...
在 Windows 下使用 Eclipse 开发 C++ 项目时,可能会遇到 “Lauch failed. Binary not found” 的错误,这个问题的解决方案可以分为以下几个方面: 1. 项目设置:在 Eclipse 中,项目的设置非常重要,特别是当我们...
在编写完代码之后,尝试运行程序可能会出现“launch failed binary not found”的错误提示。这是因为程序尚未被编译成可执行文件。因此,需要先构建项目。 1. **构建项目**:选择菜单栏中的“Project”>“Build ...
### Linux中找不到编译内核提示mkimage command not found – U-Boot images will not be built的解决方法 在Linux环境中进行嵌入式系统的开发时,经常会遇到各种编译错误或缺失依赖的问题。其中,“mkimage ...
"android系统开发--HAL层开发基础" Android HAL层,即硬件抽象层,是 Google 响应厂家“希望不公开源码”的要求推出的新概念。Android HAL层的主要作用是将硬件抽象出来,实现硬件和软件的分离,使得Android系统...
在使用虚拟机软件(如VMware)进行系统安装或测试时,有时会遇到“Operating System not found”这一错误提示,导致无法正常启动虚拟机中的操作系统。本文将详细介绍这一问题的常见原因及解决方案,确保您可以顺利...
在Unity引擎中开发Android应用程序,理解并正确配置Android SDK和JDK是至关重要的步骤。本文将详细介绍这两个组件以及如何在Unity环境下设置它们。 首先,**Android SDK(Software Development Kit)**是Google为...
错误提示如下图: 出现这种情况的原因通常是因为先安装了Framework,后安装的IIS; 运行cmd,输入: 代码如下:C:\Windows\Microsoft.NET\Framework\V4.0.30319\aspnet_regiis -i 注:C:\Windows\Microsoft.NET\...
在Android开发过程中,有时我们可能会遇到“BMapApiEngine_xxx library not found!”这样的错误,这通常是由于在使用百度地图SDK时,相应的动态库没有被正确加载导致的。本文将详细解析这个问题的原因,并提供解决...
标题 "XMNT2002 NOT FOUND" 指出的是一个特定的程序或系统组件在用户尝试运行或查找时无法被找到的情况。这可能是由于多种原因,包括但不限于文件丢失、误删除、病毒感染或者软件安装不完整。让我们深入探讨这个问题...
下过别人的sqlite3,解决了sqlite not found 问题,但是又出现了CANNOT LINK EXECUTABLE: cannot locate symbol "sqlite3_enable_load_extension" referenced by "sqlite3"... ,所以自己创建与4.3版本的模拟器,导...
在使用Linux或Unix类操作系统时,可能会遇到"sqlite3 not found"这样的错误提示,这通常意味着系统中没有安装SQLite3这个数据库引擎或者其路径没有被正确地添加到系统的PATH环境变量中。SQLite3是一个轻量级、开源的...
然而,在使用过程中,有时用户可能会遇到“Not found any active target”的错误提示,这通常是由于项目配置问题或插件与IDE之间的通信异常导致的。 首先,我们要理解这个错误的含义。“Not found any active ...