【zz】EABI还是GNU/Linux

本文介绍了如何根据目标系统选择正确的交叉编译工具链。通过对比不同版本的Sourcery G++ Lite,指导开发者为Linux内核及应用开发选择最适合的GNU/Linux版本。

http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite

 

应该选用GNU/Linux

=====================================

如何正确选择合适的交叉工具链

 

http://www.linuxidc.com/Linux/2011-04/35068.htm

我们自己可以编译制作一个交叉编译工具链(Cross-compile Toolchain)来用,但为了方便、稳定起见,我们大多数时候会去选择成熟的第三方工具链。

codesourcery的交叉工具链是很常见的一种,以ARM为例,我们可以从http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite处下载到最新的版本:

 

Target OS Download 
EABI Sourcery G++ Lite 2010.09-51
All versions...  
uClinux Sourcery G++ Lite 2010.09-58
All versions...  
GNU/Linux Sourcery G++ Lite 2010.09-50
All versions...  
SymbianOS Symbian ADT Sourcery G++ Lite 4.4-172
All versions... 


可以看到有4个OS平台版本可供选择,那么该选择哪一个下载呢?

在codesourcery的一个页面上我们找到了答案:

This table applies to the target system on which your applications will run, not to the host system on which you run Sourcery G++. 
Target Platform Description 
EABI/ELF RTOS systems or bare metal systems where no operating system is present. These configurations should not be used to build Linux kernels or applications.  用于RTOS或者没有os的硬件设备。这个配置不能用于构建内核或者应用程序。


uClinux™ Systems running uClinux, i.e. Linux on CPUs without an MMU. Use Sourcery G++ to build both the uClinux kernel and applications.  
GNU/Linux® Systems running full Linux, i.e., Linux on CPUs with an MMU. Use Sourcery G++ to build both the Linux kernel and applications.  这个用于运行带有MMU的CPU上的linux系统。可以构建linux内核和应用程序。


Microsoft Windows® Systems running Microsoft Windows 2000, or later. 

 

也就是说,如果打算用来编译linux kernel或者基于linux的应用程序,则应该选择GNU/Linux;EABI/ELF适用于没有操作系统(或者RTOS)的裸机;uClinux适用于没有MMU的Linux。

这下明白了?

### 链接器错误 `cannot find -llog` 的解决方案 在 RK3288 Android 5.1 环境下遇到链接器错误 `cannot find -llog`,通常是因为编译环境中缺少必要的库文件或者路径配置不正确。以下是详细的分析和解决方法: #### 错误原因 该问题的核心在于链接阶段无法找到 `-llog` 库文件。Android 平台上的日志功能依赖于 `liblog.so` 或者静态版本的 `liblog.a` 文件[^1]。如果这些文件未被正确包含到工具链中,则会出现此错误。 --- #### 解决方案 ##### 方法一:确认工具链中的 liblog 存在 检查当前使用的工具链目录是否包含了 `liblog.so` 或 `liblog.a` 文件。对于 ARM 架构下的工具链,可以按照以下路径查找: ```bash $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/<version>/../../../../arm-linux-androideabi/sysroot/usr/lib/ ``` 如果没有发现上述文件,可能需要手动复制它们至目标位置。可以从其他完整的 NDK 安装包提取所需的动态或静态库文件并放置于此处[^2]。 ##### 方法二:调整 LDFLAGS 参数 确保在构建脚本中设置了正确的链接选项以及库搜索路径。例如,在 Makefile 中加入如下参数: ```makefile LDFLAGS += -L$(SYSROOT)/usr/lib -llog ``` 其中 `$(SYSROOT)` 是指代系统根目录 (sysroot),它定义了目标平台的标准库所在的位置[^3]。 另外需要注意的是,某些情况下还需要指定 ABI 版本号来匹配特定架构的需求;比如针对 armeabi-v7a 可能要额外增加标志位如 `-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp` 等[^5]。 ##### 方法三:验证环境变量设置无误 再次核验 `$PATH`, `$CC`, 和 `$CXX` 是否指向合适的交叉编译器实例。例如当采用 arm-linux-androideabi 工具链时应满足下面条件之一: ```bash export PATH=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH export CC=arm-linux-androideabi-gcc export CXX=arm-linux-androideabi-g++ ``` 同时也要保证 SYSROOT 被正确定义以便让编译器知道去哪里寻找头文件与共享对象(.so)[^4]. --- ### 示例代码片段 假设我们正在尝试通过命令行调用 g++ 来完成一个简单的程序编译工作,那么最终执行语句看起来会像这样: ```bash arm-linux-androideabi-g++ test.cpp \ --sysroot=$NDK/platforms/android-21/arch-arm/ \ -I$NDK/sources/cxx-stl/gnu-libstdc++/4.9/include \ -L$NDK/platforms/android-21/arch-arm/usr/lib \ -llog -o output_binary ``` 这里特别强调了 sysroot 参数的重要性因为它决定了哪些标准库会被加载用于整个过程当中. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值