'ndk-build -n' 妙用

ndk-build以及其他linux下面的make 系统一般都会提供一个-n参数,这个参数的意义是只生成编译链接的指令,而不执行指令。这个命令可以用于解决以下问题:


1. 编译遇到莫名其妙的编译错误,或者感觉宏定义得不对;
2. 一个头文件的路径明明已经加入进去,但是编译器报找不到头文件中声明的函数或者类;
3. 头文件的include路径不对;
4. 确认某些文件的编译参数;
5. 生成汇编代码;

6. (more....)


具体的方法:
1. 到你感兴趣的工程的目录进行 ndk-build -n > ~/1.txt, ndk-build命令还可以设置一些环境变量。
   例如:编译AC和V8版本:
    cd core/WebKit/android/ac/java 
    ndk-build USE_AC=1 USE_V8=true -n > ~/1.txt
2. 打开~/1.txt,找到你感兴趣的文件的编译指令,
    假如找不到你要文件,那么可以修改一下文件然后保存,再执行 ndk-build ***** -n > ~/1.txt
3. 把编译指令完整copy出来,保存为~/1.sh

内容类似于:

ccache /home/imlongo/android-sdk-ndk/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi-v7a/objs/gl2jni/jni/etc1.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-exceptions -fno-rtti -O2 -g -DNDEBUG -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -I/SVN/myproject/hello-gl2/android-4.0/include -I/SVN/myproject/hello-gl2/libskia-gpu/src/core -I/SVN/myproject/hello-gl2/libskia-gpu/include/core -I/SVN/myproject/hello-gl2/libskia-gpu/include/config -I/SVN/myproject/hello-gl2/libskia-gpu/include/effects -I/home/imlongo/android-sdk-ndk/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I/SVN/myproject/hello-gl2 -DANDROID -mfpu=neon -Wa,--noexecstack   -Os -Wreturn-type -Wuninitialized   -I/home/imlongo/android-sdk-ndk/android-ndk-r8d/platforms/android-9/arch-arm/usr/include -c  /SVN/myproject/hello-gl2/jni/etc1.cpp -o ./obj/local/armeabi-v7a/objs/gl2jni/jni/etc1.o

4. 在命令中你可以看到各种-I参数, 通过这些参数你可以检查自己的include路径是否正确从而解决 第3个问题;
5. 在命令中你可以看到各种编译参数,和-D define命令,可以解决 第4个问题;
6. 对于第1和第2两个问题,我们需要生成文件的预编译结果;
修改~/1.sh的内容,如果发现ccache,则将其去掉,把 ./obj/local/armeabi***.o.d 的路径改为 ~/1.d 把 -c 参数改为-E -dD,把-o ./obj/local/armeabi*****/**.o 改为  > ~/1.i
类似

/home/albert/android-sdk-ndk/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ -MMD -MP -MF ~/1.d -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-exceptions -fno-rtti -O2 -g -DNDEBUG -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -I/SVN/myproject/hello-gl2/android-4.0/include -I/SVN/myproject/hello-gl2/libskia-gpu/src/core -I/SVN/myproject/hello-gl2/libskia-gpu/include/core -I/SVN/myproject/hello-gl2/libskia-gpu/include/config -I/SVN/myproject/hello-gl2/libskia-gpu/include/effects -I/home/albert/android-sdk-ndk/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I/SVN/myproject/hello-gl2 -DANDROID -mfpu=neon -Wa,--noexecstack   -Os -Wreturn-type -Wuninitialized   -I/home/albert/android-sdk-ndk/android-ndk-r8d/platforms/android-9/arch-arm/usr/include -E -dD  /SVN/myproject/hello-gl2/jni/etc1.cpp > ~/1.i

然后在刚才进行 ndk-build的地方运行 sh ~/1.sh
这样你就可以打开~/1.i进行分析;
a. 对于宏定义不对的情况,可以直接查找宏的名称,你就可以看到它定义的地方,1.i 前面有很多宏定义,这些宏是GCC预定义或者是编译指令定义的;
b. 莫名其妙的编译错误,可以仔细检查出错的地方的预编译结果;
c. 对于第2个问题,可以查找对应的头文件名称,看看是否有两个同名但是位置不一样的头文件,导 致头文件覆盖;
7. 还可以修改命令来生成汇编结果,

命令改为 

/home/albert/android-sdk-ndk/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ -MMD -MP -MF ~/1.d -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-exceptions -fno-rtti -O2 -g -DNDEBUG -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -I/SVN/myproject/hello-gl2/android-4.0/include -I/SVN/myproject/hello-gl2/libskia-gpu/src/core -I/SVN/myproject/hello-gl2/libskia-gpu/include/core -I/SVN/myproject/hello-gl2/libskia-gpu/include/config -I/SVN/myproject/hello-gl2/libskia-gpu/include/effects -I/home/albert/android-sdk-ndk/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I/SVN/myproject/hello-gl2 -DANDROID -mfpu=neon -Wa,--noexecstack   -Os -Wreturn-type -Wuninitialized   -I/home/albert/android-sdk-ndk/android-ndk-r8d/platforms/android-9/arch-arm/usr/include -S  /SVN/myproject/hello-gl2/jni/etc1.cpp -o ~/1.S

-dD参数(保留宏定义)

你可能感兴趣的:(NDK开发)