clang(llvm)命令调用android NDK 编译C应用

在window下载的android NDK解压后,可以用如下命令,安装NDK独立编译工具。这样再用命令时不用带一把参数了。

"D:\Program Files\python27\python" make_standalone_toolchain.py --arch arm --api=9 --install-dir=d:/test --force

其中python27去下了安装就好。

然后简单的

D:\test\bin\arm-linux-androideabi-gcc -o test test.cpp 或

D:\test\bin\clang -o test test.cpp

都可以编出一个简单的示例。我用的是clang 编出的好似用不支持arm6以下的。只能用于armv7以上。

如果需要支持arm6下以如以改写bin目录下的clang.cmd方件。

@echo off
if "%1" == "-cc1" goto :L
rem %~dp0\clang38.exe -target armv7a-none-linux-androideabi --sysroot %~dp0\..\sysroot %*
%~dp0\clang38.exe -target armv5te-none-linux-androideabi --sysroot %~dp0\..\sysroot %*
if ERRORLEVEL 1 exit /b 1
goto :done
:L
rem target/triple already spelled out.
%~dp0\clang38.exe %*
if ERRORLEVEL 1 exit /b 1
:done
 

又或者用带参数调用

\clang38.exe -target armv5te-none-linux-androideabi --sysroot=D:\test\sysroot -o test test.cpp

相比如下的调用是简单了一些,省了编译器与库的指定。

D:\android-ndk\android-ndk-r13b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-gcc --sysroot=D:\android-ndk\android-ndk-r13b\platforms\android-9\arch-arm -o test test.c 

 

如果是自已开发的新工程用这种主法编译是一点问题也没有的。但如果是已有工程,换android-ndk编译,就要分多种情况了。

1,已有LINUX工程,GNU工具,可以编译成arm-linux。这时改写的主要问题就在于库的不同。第三方编译器CodeSourcery是个不错的选择,不过这个工具对最新的CPU支持不好,因为公司被收购了,新版的不公开源码了。这时,要么改写代码,要么改写CodeSourcery的源码使它支持新的arm指令集。两种方法都要花去大量的时间。但是真的没有比较好的选择。

2,有一些代码一在编写时就考虑了,android-linux. 又或者,有人修改源码,并公开了代码,这时方便多了。

3,最新的android studio考虑用的是LLVM工具链。用的是CMAKE。因为是传统的.confige去配置编译。虽然最的LLVM还是会去设用GCC,但make文件不一样,中间对源码的休改也是由CMAKE完成的。这时用CodeSourcery不能用了,cmake对它的支持不太好。这时有个CMAKE支持的开源工具codeblock这个我还没用过,一会去试用一下。

试了这多多东西,我的主要目标,编译一个可用的lldb-server 支持armv6的还没实现,还没看到方便实现的可能性。官方文档说android至少要是api21的但我不信。要用api9. 用CMAKE,ninja, ndk(clang,gcc)编译了一下,报错,没法进行下去。主要的还是CMAKE的机制不太了解,不知道应去配什么地方,并且对ninj和clang都不了解,也不知它们需要配成什么样。现在只是用cmake编译小程序通过了,但对LLDB安官网给出的编译配置参数通不过。先去了解一下以codeblock然后再说吧。

 

你可能感兴趣的:(普通)