对编译器版本的疑问
Android的内核和应用用的是两个不同版本的编译器编译,eclipse编译的程序安装到Android4.4.2上为什么可以运行呢?
Linux的时候应用和内核都要同一个编译器版本编译应用才能跑起来哈
最好是统一好一点吧,
另外app是java编译的。跑不起来一般是api选的不对吧。
谢谢刘工,
linux下两个不同版本号编译器,编译的库和应用都不能在另一个版本编译器的系统中运行的;android的为什么可以呢,底层内核也是linux哈;
难道是arm-linux-androideabi各个版本对代码的要求和检查项都是一样标准?
本次 64 位 ABI (Application Binary Interface)的默认编译器为 GCC 4.9,最低支持 API 等级(API Level)为 Android L 的 更新等级(Android 4.4 的 API Level 为 19,新版本应为 20)
------------------------------
按上面描述看版本相差不大情况下是有兼容的;每一个版本的Android平台只支持有一个API级别,虽然该支持是隐含地包括了所有早期的API级别(一直到API级别1级)
"Linux的时候应用和内核都要同一个编译器版本编译应用才能跑起来哈"
=> 没这回事。只要编译器支持该 CPU 架构和作业系统的执行档格式,编译出来的结果就可以兼容。
有些应用和内核会挑编译器版本,是因为应用到一些较为特殊的语法。版本不对可能无法顺利编译。通常改写一下就可以。
较接近你说的情况是编译内核和驱动时要注意 kernel headers 需要一致 (最好同一版本)。内核有时会改变内部资料结构,驱动若参考到旧版 header,运作就会不正确。kernel headers 有时会隐身在 toolchain 当中,一般人只看到 toolchain 的编译器版本,容易误以为是编译器版本所造成的结果。
或者,你说的编译器的不同版本实在是差异太大了。譬如,MTK/Android 5.0 的应用开始强要求 PIE 模式。你若用太旧的编译器可能无法编译 PIE 模式的库和应用。
谢谢RupertLi